在MATLAB中用单行语句替换循环

时间:2013-03-23 07:20:51

标签: matlab for-loop vectorization

我有这个功能需要运行数百次。它包含一个for循环,我试图删除它以使功能更快。有人可以帮我用单行命令替换循环。

nn = 4;
T = [5 1 2; 5 2 3; 5 3 4; 5 4 1];
p = [0 0; 1 0; 1 1; 0 1; 0.5 0.5];
A = zeros(nn,1);    
for i=1:nn
    sctr = T(i,:); pT = p(sctr,:);
    A(i) = 1/2*det([pT,ones(3,1)]);  
end

或许删除det并将其替换为实际公式以计算行列式会有帮助吗?

2 个答案:

答案 0 :(得分:1)

您拥有的For循环解决方案可能是最快的。其他选择是:

B = [p(T',:),ones(3*size(T,1),1)] 
C= mat2cell(B,[3,3,3,3],3)
D= cellfun(@det,C);

或者你也可以写{而不是D这个表达

D = arrayfun(@(x) det(C{x}), 1 : size(C, 1));

等...

答案 1 :(得分:0)

我认为这样可行(因为我没有环境,所以无法测试)

pT = p(T(1:nn,:),:);
A = 1/2 * det([pT, ones(3, 1)]);

显然,您可以从上面的代码中执行一行代码,但这样的可读性会降低。

如果它不起作用且保持for循环,至少考虑矩阵预分配(对于A,pT和sctr),这将加速你的程序。