我想创建一个生成随机矩阵nxn(2D数组)的程序,我必须在其上进行计算,其元素与其主对角线对称,每行的总和等于1.
我尝试了太多算法,但没有人正常工作,我可以通过输入
来做矩阵对称for i=1:n
n=rand(100);
for j=1:n
if(j>i)
matrix(i,j) = rand(100);
matrix(j,i)=matrix(i,j);
else if (j==i)
matrix = rand(100);
end
end
end
我也可以通过找到每一行的总和,然后将每个元素与该行的总和相除,然后当我将该行的总和等于1时,将矩阵的行的总和等于1。
for i=1:n
for j=1:n
matrixS(i,j) = matrix(i,j)/sum(i); % The vektor of the row sums is made by another algorithm
end
end
问题是当我想用我提到的所有特征制作这个数组时,每行等于1,矩阵由主对角线对称
有什么想法吗?
答案 0 :(得分:2)
如果这是足够随机的,您可以生成具有随机非对角线元素的对称矩阵,然后调整对角线,使行(和列)总和等于1.
n = 4;
randMat = zeros(n);
randMat(tril(true(n),-1)) = rand( n*(n-1)/2, 1); %# fill in some values
randMat = randMat + randMat'; %# make symmetric
randMat(eye(n)>0) = 1 - sum(randMat,2); %# adjust diagonal
%# Example
randMat =
-0.7829 0.2785 0.5469 0.9575
0.2785 -0.4010 0.9649 0.1576
0.5469 0.9649 -1.4824 0.9706
0.9575 0.1576 0.9706 -1.0857
>> sum(randMat) %# the same as sum(randMat,2)'
ans =
1.0000 1.0000 1.0000 1.0000