计算矩阵的每个对角线的总和

时间:2016-10-12 07:18:34

标签: matlab matrix sum diagonal

我有一个像A这样的矩阵,我想计算这个矩阵的每个对角线的总和,并在像Y这样的矢量中显示它。

A=[1 2 3; 4 5 6; 7 8 9]

Y=[3 8 15 12 7]

我知道代码

[sum(diag(y,2)),sum(diag(y,1)),sum(diag(y,0)),sum(diag (y,-1)),sum(diag (y,-2))]

但我想把它写成一个函数。

3 个答案:

答案 0 :(得分:5)

spdiags可以完全按照您的意愿行事:

<p:dataTable id="dt_notselectedContent"
   var="notselectedContent"
   value="#{verwaltung.alNotSelectedContent}"
   rows="5"
   rowIndexVar="rowIndex"
   selectionMode="multiple"
   selection="#{bean.alContent}"
   rowKey="#{bean.alNotSelectedContent.get(rowIndex).get(0)}"
   paginator="true"
   paginatorTemplate="{CurrentPageReport} {RowsPerPageDropdown}"
   rowsPerPageTemplate="5,10"
   rendered="#{not empty verwaltung.alNotSelectedContentForLinkedList}"
   style="width: auto; height: auto">

   <p:ajax event="rowSelect" listener="#{verwaltung_store.onRowSelect(event)}" />

您可以使用fliplr反转向量并创建一个函数:

dsum = sum(spdiags(A))

<强> RESULT

function dsum = diagsum(A)
    dsum = fliplr(sum(spdiags(A)));
end

答案 1 :(得分:3)

这是一个可能的解决方案:

[r ,c]=size(A);
idx=bsxfun(@plus,(r:-1:1)',0:c-1);
s=flipud(accumarray(idx(:),A(:)));

将此方法与其他答案中提出的spdiags进行比较,此方法在Octave中的表现要好得多。的基准:

A = rand(1000);
disp('---------bsxfun+accumarray----------')
tic
    [r ,c]=size(A);
    idx=bsxfun(@plus,(r:-1:1)',0:c-1);
    s=flipud(accumarray(idx(:),A(:)));
toc
disp('---------spdiags----------')
tic
    dsum = fliplr(sum(spdiags(A)));
toc

<强>结果:

---------bsxfun+accumarray----------
Elapsed time is 0.0114651 seconds.
---------spdiags----------
Elapsed time is 8.62041 seconds.

答案 2 :(得分:1)

类似于the answer from rahnema1,您还可以在应用toeplitz之前使用accumarray生成索引:

[r, c] = size(A);
index = toeplitz(c:(r+c-1), c:-1:1);
Y = accumarray(index(:), A(:)).';