1

我有这个需要运行数百次的功能。它包含一个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并用实际公式替换它来计算行列式会有所帮助?

4

2 回答 2

2

您拥有的 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));

ETC...

于 2013-03-23T08:46:29.137 回答
0

我认为这会起作用(我无法测试它,因为我没有我的环境)

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

您显然可以从上面的代码中编写一行代码,但这会不太可读。

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

于 2013-03-23T07:54:15.370 回答