從一個快速測試,它看起來像你正在做的事情只與下三角。您可能能夠使用醜陋的技巧,比如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應該能夠輕鬆加速。你可以用L(a,b) = all(...)
代替if。
EDIT1
更新版本,以防止C
浪費~ n^3
空間:
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);
EDIT2
輕微變形,不使用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));
旁註用於在Matlab中的變量:[http://stackoverflow.com/questions/14790740/using-i-and-j-as-variables-in-matlab](http://stackoverflow.com/questions/14790740/using-i-和-j-as-variables-in-matlab) –
感謝您的提示。我已將「i」,「j」,「k」更名爲「a」,「b」,「c」。 – bluebox
我不確定你是否意識到這一點,但所有([])評估爲真。所以,例如,當一個== 2,b將是1,並且c將是[]。這將最終使L(a,b)1。你可能需要考慮你的b和c範圍(我可能是錯的;也許這就是你打算如何工作)。 – ioums