如何将矩阵 R 放入循环中并生成矩阵 R> 的新值> [关闭]
Posted
技术标签:
【中文标题】如何将矩阵 R 放入循环中并生成矩阵 R> 的新值> [关闭]【英文标题】:How can I put matrix R in a loop and generate new values of matrix R> [closed] 【发布时间】:2021-02-08 14:16:00 【问题描述】:我有一个矩阵R
,它的对角矩阵0
和行的总和应该总是一。如何以只有创建 sum = 1
的值在迭代后更改的方式更新矩阵。如何使用 for 循环来做到这一点?
R = M(1:end, 1:end-1)
R =
0.00000 0.22013 0.59930 0.00000 0.00000 0.18057
0.00000 0.00000 0.22196 0.00000 0.77804 0.00000
0.00000 0.00000 0.00000 0.60774 0.00000 0.39226
0.00000 0.00000 0.17406 0.00000 0.09191 0.00000
0.73861 0.11227 0.00000 0.00000 0.00000 0.14912
0.00000 0.26643 0.24617 0.15687 0.00000 0.00000
这是我目前的 R。我只希望通过 for 循环迭代将值例如 0.22013
0.59930
和 0.18057
更改为另一个变体。
【问题讨论】:
欢迎来到***!到目前为止,您尝试了什么,您是否一直在通过 *** 搜索已经在 matlab 中寻找矩阵上的 for 循环示例? 您好,欢迎您!请详细说明您在为什么而苦苦挣扎。你不知道怎么做一个for循环?如何访问矩阵?要不然是啥?目前尚不清楚您的问题是什么。 【参考方案1】:在 MATLAB 中:
新生成的数组,各行总和为 1:
此解决方案侧重于三个主要领域:
• 查找每行中的非零索引。
这是通过使用基于条件(R ~= 0)
的find()
函数来完成的,导致find(R ~= 0)
返回非零索引。
• 创建一组总和为 1 且集合大小等于非零索引数量的随机数。
使用函数rand()
可以生成一组数字。为了确保这组数字加起来等于 1,我们可以除以生成集的sum()
。设置大小可以由第二个输入参数指定。在这种情况下,我们希望集合大小为 1,乘以给定行中的非零索引数。这样我们可以逐行替换for循环中的值。调用看起来类似于rand(1,Number_Of_Non_Zero_Indices)
→ rand(1,length(Non_Zero_Indices)
。
• 设置新创建的值集以替换旧的非零值。
为了替换旧的非零值,我们使用find()
函数生成的索引和矩阵索引R
矩阵的给定行。要逐行替换值,矩阵索引被调用:
R(Row,Non_Zero_Indicies) = Random_Set;
在哪里,
Row
是 for 循环中的循环变量,Non_Zero_Indicies
是 find()
函数生成的索引。这允许结果集替换相应的索引。
完整脚本:
%Initializing the matrix%
R = [
0.00000 0.22013 0.59930 0.00000 0.00000 0.18057;
0.00000 0.00000 0.22196 0.00000 0.77804 0.00000;
0.00000 0.00000 0.00000 0.60774 0.00000 0.39226;
0.00000 0.00000 0.17406 0.00000 0.09191 0.00000;
0.73861 0.11227 0.00000 0.00000 0.00000 0.14912;
0.00000 0.26643 0.24617 0.15687 0.00000 0.00000
];
[Number_Of_Rows,Number_Of_Columns] = size(R);
Number_Of_Iterations = 5;
Iteration = 1;
while(Iteration < Number_Of_Iterations)
for Row = 1: Number_Of_Rows
%Grabbing the row indices%
Row_Vector = R(Row,:);
%Finding non-zero indices%
Non_Zero_Indicies = find(Row_Vector ~= 0);
%Generating random set of numbers%
Random_Set = rand(1, length(Non_Zero_Indicies));
%Normalizing the set so that the values add to 1%
Normalization_Factor = sum(Random_Set);
Random_Set = Random_Set / Normalization_Factor;
%Using matrix indexing to replace the values%
R(Row,Non_Zero_Indicies) = Random_Set;
R
end
Iteration = Iteration + 1;
end
可以通过修改变量Number_Of_Iterations
来改变R
新生成的变体数量。
函数形式:
为了清理代码,可以将数组生成脚本放入一个函数中。可以迭代调用此函数以根据需要生成尽可能多的变体。
函数调用:
%Initializing the matrix%
R = [
0.00000 0.22013 0.59930 0.00000 0.00000 0.18057;
0.00000 0.00000 0.22196 0.00000 0.77804 0.00000;
0.00000 0.00000 0.00000 0.60774 0.00000 0.39226;
0.00000 0.00000 0.17406 0.00000 0.09191 0.00000;
0.73861 0.11227 0.00000 0.00000 0.00000 0.14912;
0.00000 0.26643 0.24617 0.15687 0.00000 0.00000
];
[R] = Generate_New_Array(R);
R
功能:
function [R] = Generate_New_Array(R)
[Number_Of_Rows,~] = size(R);
for Row = 1: Number_Of_Rows
%Grabbing the row indices%
Row_Vector = R(Row,:);
%Finding non-zero indices%
Non_Zero_Indicies = find(Row_Vector ~= 0);
%Generating random set of numbers%
Random_Set = rand(1, length(Non_Zero_Indicies));
%Normalizing the set so that the values add to 1%
Normalization_Factor = sum(Random_Set);
Random_Set = Random_Set / Normalization_Factor;
%Using matrix indexing to replace the values%
R(Row,Non_Zero_Indicies) = Random_Set;
end
end
使用 MATLAB R2019b 运行
【讨论】:
非常感谢您的努力!这对我的例子来说工作顺利。我已经创建了矩阵和对角线,但这是我唯一挣扎的一步。我很感激。 @AmraFeta 没问题,很乐意提供帮助。 :) 如果这充分回答了您的问题,请考虑接受答案/投票。以上是关于如何将矩阵 R 放入循环中并生成矩阵 R> 的新值> [关闭]的主要内容,如果未能解决你的问题,请参考以下文章