Ниже приводится сравнение всех упомянутых методов до сих пор, а также несколько других вариантов я мог думать. Это было протестировано на 64-битном R2013a с использованием функции TIMEIT.
function [t,v] = testAntiDiag()
% data and functions
A = magic(5000);
f = {
@() func0(A) ;
@() func1(A) ;
@() func2(A) ;
@() func3(A) ;
@() func4(A) ;
@() func5(A) ;
@() func6(A) ;
@() func7(A) ;
};
% timeit and check results
t = cellfun(@timeit, f, 'UniformOutput',true);
v = cellfun(@feval, f, 'UniformOutput',false);
assert(isequal(v{:}))
end
function d = func0(A)
d = diag(A(end:-1:1,:));
end
function d = func1(A)
d = diag(flipud(A));
end
function d = func2(A)
d = flipud(diag(fliplr(A)));
end
function d = func3(A)
d = diag(rot90(A,3));
end
function d = func4(A)
n = size(A,1);
d = A(n:n-1:end-1).';
end
function d = func5(A)
n = size(A,1);
d = A(cumsum(n + [0,repmat(-1,1,n-1)])).';
end
function d = func6(A)
n = size(A,1);
d = A(sub2ind([n n], n:-1:1, 1:n)).';
end
function d = func7(A)
n = size(A,1);
d = zeros(n,1);
for i=1:n
d(i) = A(n-i+1,i);
end
end
Таймингов (в том же порядке, как они определены выше):
>> testAntiDiag
ans =
0.078635867152801
0.077895631970976 % @AlexR.
0.080368641824528
0.195832501156751
0.000074983294297 % @thefourtheye
0.000143019460665 % @woodchips
0.000174679680437
0.000152488508547 % for-loop
Наиболее результат для выше удивительного меня является последним. По-видимому, компиляция JIT очень эффективна для таких простых for-loops.
возможно дубликат [Есть ли функция, чтобы получить перекос диагонали матрицы в MATLAB?] (Http://stackoverflow.com/questions/5201426/is-there-a -function-to-get-the-skew-diagonal-of-a-matrix-in-matlab) – horchler
FYI, правильный термин для этого - «[антидиагональный] (http://en.wikipedia.org/wiki/Anti-diagonal_matrix)». – horchler