我有这个功能需要运行数百次。它包含一个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
并将其替换为实际公式以计算行列式会有帮助吗?
答案 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),这将加速你的程序。