簡単なテストから、下の三角形のみで何かをしているように見えます。これ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));