我想得到这个:如果
a=1 2 3
4 5 6
7 8 9 i want a at the end to be
a= 1 6 9
12 25 18
49 24 81
这意味着对角线我在正方形也做了相反的对角线 矩阵中的其他元素我将它们与3一起使用。所以我 到目前为止有这个:
a=rand(n)
c=fliplr(diag(diag(a)).^2)+(tril(a,-1)+triu(a,1)*3)
i=(diag(diag(fliplr(a)))).^2
c(1:n+1:n^2)=0
result=fliplr(c+i)
如果我在一个命令窗口中执行此操作,但我想将其写为 功能!提前谢谢。
答案 0 :(得分:1)
它更容易使用逻辑索引。如果您想将其用作函数,只需使用function A = myfunc(A)
% random matrix
n = 5;
A = randi(10,n);
% here you can do:
% function A = myfunc(A)
% diagonal indexes
diagIdxs1 = eye(size(A),'logical');
diagIdxs2 = fliplr(diagIdxs1);
diagIdxs = diagIdxs1 | diagIdxs2;
% do operations on diagonals and on non-diagonals
A(diagIdxs) = A(diagIdxs).^2;
A(~diagIdxs) = A(~diagIdxs).*3;
答案 1 :(得分:0)
使用逻辑索引的更短且计算速度更快的替代方法是使用逐元素乘法和逐元素幂。
% function b = myfun(a)
n = 10000
a = randi(10,n);
I = eye(size(a,1),'logical');
b = a.^2.*I + a.*3.*~I;
% end