我有一个数组,其中包含一组按时间顺序排列的序列号和另一个源数组,其中随机序列号与数值相关联。该代码在MATLAB中创建一个新的单元格数组,在一列中按时间顺序排列完整的序列号,如果两个原始源数组中的序列号匹配,则在下一列中插入相关的数值。如果他们不这样做,代码只会复制先前的相关值,直到有新的匹配。
j = 1;
A = {random{1:end,1}};
B = cell2mat(A);
value = random{1,2};
data = cell(length(serial), 1);
data(:,1) = serial(:,1);
h = waitbar(0,'Please Wait...');
steps = length(serial);
for k = 1:length(serial)
[row1, col1, vec1] = find(B == serial{k,1});
tf1 = isempty(vec1);
if (tf1 == 0)
prices = random{col1,2};
data(j,2) = num2cell(value);
j = j + 1;
else
data(j,2) = num2cell(value);
j = j + 1;
end
waitbar(k/steps,h,['Please Wait... ' num2str(k/steps*100) ' %'])
end
close(h);
目前,代码的运行时间约为4小时。我想让这段代码运行得更快。请建议任何方法。
更新
source input (serial)
1
2
3
4
5
6
7
source input (random)
1 100
2 105
4 106
7 107
desired output (data)
SR No Value
1 100
2 105
3 105
4 106
5 106
6 106
7 107
答案 0 :(得分:4)
首先,运行MATLAB探查器(参见'doc profile')并查看大部分执行时间的发生位置。
其次,不要在每次迭代时更新等待栏>特别是如果序列包含大量(> 100)个元素。
做类似的事情:
if (mod(k, 100)==0) % update on every 100th iteration
waitbar(k/steps,h,['Please Wait... ' num2str(k/steps*100) ' %'])
end
答案 1 :(得分:0)
有些观点:
首先,如果你给我们一些示例输入和输出数据,它会有很大的帮助。
为什么要将data
初始化为一列,然后在循环中填充第二列?而是将其初始化为2列:data = cell(length(serial), 2);
j
与k
有什么不同,它们看起来与我相同,你可以放下j = j + 1
行。
tf1 = isempty(vec1); if (tf1 == 0)...
与单行相同:if (!isempty(vec1))
甚至更好if(isempty(vec1))
,然后交换else
和if
的代码。< / p>
但我认为如果您提供一些(简短的)样本输入和输出数据,您可能会找到一个快速的解决方案。