从快速测试来看,您似乎只使用下三角形做某事。您也许可以使用类似于此的ind2sub
丑陋技巧进行矢量化arrayfun
tril_lin_idx = find(tril(ones(n), -1));
[A, B] = ind2sub([n,n], tril_lin_idx);
C = arrayfun(@(a,b) b+1 : a-1, A, B, 'uniformoutput', false); %cell array
f = @(a,b,c) all(x(c{:})' < x(b) + (x(a) - x(b)) * ((b - c{:})/(b-a)));
L = zeros(n, n);
L(tril_lin_idx) = arrayfun(f, A, B, C);
我无法测试它,因为我没有x
而且我不知道预期的结果。我通常喜欢矢量化解决方案,但这可能有点过分了:)。我会坚持使用您的显式 for 循环,这可能更清晰,并且 Matlab 的 JIT 应该能够轻松加速。您可以将 if 替换为L(a,b) = all(...)
.
编辑1
更新版本,以防止浪费~ n^3
空间C
:
tril_lin_idx = find(tril(ones(n), -1));
[A, B] = ind2sub([n,n], tril_lin_idx);
c = @(a,b) b+1 : a-1;
f = @(a,b) all(x(c(a, b))' < x(b) + (x(a) - x(b)) * ((b - c(a, b))/(b-a)));
L = zeros(n, n);
L(tril_lin_idx) = arrayfun(f, A, B);
编辑2
轻微变体,它不使用 ind2sub 并且应该更容易修改,以防b
以更复杂的方式依赖于a
. 我c
为了速度而内联,似乎特别是调用函数句柄很昂贵。
[A,B] = ndgrid(1:n);
v = B<A; % which elements to evaluate
f = @(a,b) all(x(b+1:a-1)' < x(b) + (x(a) - x(b)) * ((b - (b+1:a-1))/(b-a)));
L = false(n);
L(v) = arrayfun(f, A(v), B(v));