在matlab

时间:2018-02-17 18:55:35

标签: matlab

是否有用于生成随机n乘n矩阵的matlab命令,其中元素取自区间[0,1],非对角线上x%的条目为0.然后,另外设置元素在对角线上是各自列中每个元素的总和?为了创建对角占优势的密集/稀疏矩阵?这可能很容易编写代码,但我想知道是否已经有一个具有此功能的内置函数。

修改

我是Matlab /编程的新手,所以这说起来容易做起来难。我无法用忽略对角线的百分比制作矩阵。它是一个n×n矩阵,因此有$ n ^ 2 $个条目,其中n个在对角线上,我想要从$ n ^ 2 - n $元素中取零的百分比,即所有非对角线元素。我无法正确实现这一点。我不知道如何初始化我的M(见下文)以正确对应。

% Enter percentage as a decimal
function [M] = DiagDomSparse(n,x)
M = rand(n);
disp("Original matrix"); 
disp(M);  
x = sum(M); 
for i=1:n
   for j=1:n
      if(i == j)
         M(i,j) = x(i);
      end
   end
end
disp(M);

2 个答案:

答案 0 :(得分:3)

这是您可以使用的一种方法。我相信你现在会用更聪明的方法得到一些其他的答案,但我喜欢让事情变得简单易懂。

我在下面做的是首先创建要放在非对角线元素中的数据。我创建一个空矩阵,并使用线性索引将此数据复制到非对角元素。现在我可以计算列的总和,并再次使用线性索引将这些列写入对角线元素。因为矩阵初始化为零,所以当我计算列的总和时,对角线元素仍然为零,因此它们不会干扰。

n = 5;
x = 0.3; % fraction of zeros in off-diagonal
k = round(n*(n-1)*x); % number of zeros in off-diagonal

data = randn(n*(n-1)-k,1); % random numbers, pick your distribution here!
data = [data;zeros(k,1)];  % the k zeros
data = data(randperm(length(data))); % shuffle

diag_index = 1:n+1:n*n; % linear index to all diagonal elements
offd_index = setdiff(1:n*n,diag_index); % linear index to all other elements
M = zeros(n,n);
M(offd_index) = data; % set off-diagonal elements to data
M(diag_index) = sum(M,1); % set diagonal elements to sum of columns

答案 1 :(得分:-1)

引用你想要的对角线(n,'逻辑')。这是一个解决方案:

n=5;
M = rand(n);
disp("Original matrix"); 
disp(M);
x = sum(M); 
for i=1:n
   for j=1:n
      if(i == j)
         M(i,j) = x(i);
      end
   end
end
disp('loop solution:')
disp(M);
M(eye(n,'logical'))=x;
disp('eye solution:')
disp(M);