如何在matlab中使用矩阵的对角线而不使用循环?

时间:2017-04-25 23:36:33

标签: matlab matrix

假设我有一个矩阵,我想改变它的元素。 如何告诉matlab去(i,j)位置的元素?对于  例如:

matrix(i;j) ---> if i=j (then do something for example matrix(i;j)^2
                 else ( do something else)
matrix=rand(n)
  if (i=j)
   matrix(i,j)=(matrix(i.j))^
  else matrix(i,j)=matrix(i,j)*3
  end

现在我如何才能到达矩阵的对角线?我是matlab的新手,我还没有找到答案: 我正在寻找一个提示或东西,但我不能使用循环! 嘿,我得到了答案,但让我说我也希望对面的对角线在广场我怎么能这样做?请帮忙

> if 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

1 个答案:

答案 0 :(得分:0)

很明显,您不了解MATLAB的基础知识。在这里,我将尝试解释您需要的内容,但我鼓励您阅读MATLAB编程的基本文档。

如果您的矩阵被称为A,则可以通过该元素的索引(行数和列数)访问每个元素,例如A(2,3)为您提供第二行和第三行的元素柱。

同样diag(A)A的所有对角元素作为向量。

你提到的可以用不同的方式完成,其中一些比其他方式更有效,但对初学者来说可能更难。最简单的方法之一是使用两个for循环。第一个循环在矩阵的行上移动,而第二个循环在列上移动。目标是逐个检查所有元素。

在这里,我们使用两个变量iijj来计算矩阵行和列。 ii在行上移动,因此它必须从1开始计算到矩阵所具有的行数。对使用变量jj的列也是如此。此外,为了找到矩阵的行数和列数,我们使用函数size

在两个for循环中,我们检查元素是否在ii==jj的主对角线上,如果不是,那么你会对这些元素做其他事情。

for ii=1:size(A,1)
    for jj=1:size(A,2)
        if ii==jj
            A(ii,jj) = A(ii,jj)^2;
        else
            A(ii,jj) = A(ii,jj)*3;
        end
    end
end

更有效的解决方案如下:

diag(diag(A)).^2 + (tril(A,-1)+triu(A,1))*3

第一部分使用A主对角线上的元素计算对角矩阵。第二部分得到矩阵的上下三角部分。

示例:

A = [1 2 3 4;
    1 2 3 4;
    4 3 2 1;
    4 3 2 1];


>> diag(diag(A))

ans =

     1     0     0     0
     0     2     0     0
     0     0     2     0
     0     0     0     1


>> (tril(A,-1)+triu(A,1))

ans =

     0     2     3     4
     1     0     3     4
     4     3     0     1
     4     3     2     0

其中

diag(diag(A)) + (tril(A,-1)+triu(A,1)) equals to A