我有一个像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))]
但我想把它写成一个函数。
答案 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(:)).';