如何在Matlab中使这个特定代码运行得更快?

时间:2013-07-30 06:53:41

标签: arrays performance matlab for-loop

我有一个数组,其中包含一组按时间顺序排列的序列号和另一个源数组,其中随机序列号与数值相关联。该代码在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

2 个答案:

答案 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);

jk有什么不同,它们看起来与我相同,你可以放下j = j + 1行。

tf1 = isempty(vec1); if (tf1 == 0)...与单行相同:if (!isempty(vec1))甚至更好if(isempty(vec1)),然后交换elseif的代码。< / p>

但我认为如果您提供一些(简短的)样本输入和输出数据,您可能会找到一个快速的解决方案。