如何使用Matlab为“大数据集”矢量化for循环
问题描述:
我正在使用Matlab学习“大型”数据集计算。我有一个txt文件,包括为MTB所做的每笔交易。我的目标是将此刻度数据转换为日常数据。例如,在第一天,发生了超过15,000笔交易,我的prgm将这些数据转换为每天的开盘价,最高价,最低价,收盘价和总成交量。如何使用Matlab为“大数据集”矢量化for循环
我的问题: 你能帮我让代码更快吗? 您是否有任何实用的“技术”来验证计算,因为它们是在这样大的数据集上进行的?
这花了我的PGM:20.7757秒 ,我发出以下警告。我真的不知道这意味着什么 警告:对于单元阵列,'rows'标志被忽略。
在cell.unique在32 在EX5在16 警告: '行' 标志为单元阵列忽略。 。在32 在EX5 cell.unique在17
%DESCRIPTION: Turn tick data into daily data
%INPUT: stock tick data(tradeDate,tradeTime,open,high,low,
%close,upVol,downVol)
%OUTPUT: openDay,highDay,lowDay,closeDay,volumeDay,netTransaction
%net transaction taded = sum (price*upVol -price*downVol)
clear;
startTime=tic;
%load data from MTB_db2
[tradeDate, tradeTime,open,high,low,close,upVol,downVol]=textread('MTB_db2.txt','%s %u %f %f %f %f %f %f','delimiter',',');
%begIdx:Index the first trade for the day from tick database and
%endIdx:index for the last trade for that day
[dailyDate begIdx]=unique(tradeDate,'rows','first');
[dailyDate2 endIdx]=unique(tradeDate,'rows','last');
%the number of daily elements, useful for the loop.
n=numel(dailyDate);
%initilize arrays
highDay=[];
lowDay=[];openDay=[];closeDay=[];
volumeDay=[];netTransaction=[];
priceChange(1)=NaN; mfChange(1)=NaN;
%loop: bottleneck is here!!
for j=1:n
openDay(j)=open(begIdx(j));
closeDay(j)=close(endIdx(j));
highDay(j)=max(high(begIdx(j):endIdx(j)));
lowDay(j)=min(low(begIdx(j):endIdx(j)));
volumeDay(j)=sum(upVol(begIdx(j):endIdx(j)))+sum(downVol(begIdx(j):endIdx(j)));
cumSum=0;
for i=begIdx(j):endIdx(j)
cumSum=cumSum+close(i)*(upVol(i)-downVol(i));
end
netTransaction(j)=cumSum;
end
elapsedTimeNonVectorized=toc(startTime)
答
的代码,我会通过
cs = cumsum(close(begIdx(j):endIdx(j)) .* ...
(upVol(begIdx(j):endIdx(j)) - downVol(begIdx(j):endIdx(j))));
netTransaction(j) = cs(end);
是稍快更换内部for
循环
cumSum=0;
for i=begIdx(j):endIdx(j)
cumSum=cumSum+close(i)*(upVol(i)-downVol(i));
end
netTransaction(j)=cumSum;
。
您也可以预先分配变量highDay=zeros(1,n);
或highDay(1,n)=0;
。
不确定您可以更多地进行矢量化,因为算法具有内置函数并且事务数量不是常量。由于您的日常数据是彼此独立的,因此可以选择一种方式进行并行化。
对于测试部分,可以在假数据
- 工作,所需的输出被预先已知(数据是唯一的或1:N)。
- 程序的第二算法自己一个不同的技术,并比较结果,
- 问你的一个同事(如果可靠性是基本的最好的选择)与他所选择的语言算法亲切编程
答
只需读取unique
的文档。
'行'选项不支持单元阵列。
您的输入是一个单元格,因此您不能使用“行”标志。如果输出符合您的期望,请删除'行',一切都很好。
它如果你发布了代码的_reproducible_版本(通过不使用外部文件)会更好。 –
我该怎么做? – user1561949
替换行[[tradeDate,tradeTime,open,high,low,close,upVol,downVol] = textread('MTB_db2。txt','%s%u%f%f%f%f%f%f','delimiter',',');'带有“虚拟”数据。或提供.txt示例文件 –