如何在MATLAB中实现向量元素两两相除生成指定矩阵?
解决MATLAB生成目标矩阵的问题
嘿,我来帮你看看这个问题!你尝试的代码a./a(:)之所以没得到预期结果,是因为MATLAB的广播机制在这里的运算逻辑和你想要的不一样。让我拆解一下:
当你定义a = 1:3时,a是行向量[1,2,3],而a(:)会把它转换成列向量[1;2;3]。MATLAB在做行向量除以列向量的运算时,会自动把两者扩展成3x3的矩阵,然后逐元素相除——最终得到的每个元素是a(j)/a(i)(i是行号,j是列号),也就是j/i,所以生成的矩阵是:
1 2 3 0.5 1 1.5 0.333 0.666 1
这显然和你想要的对称矩阵不符。
方法1:用meshgrid直接生成目标矩阵
要得到你描述的对称矩阵(每个元素是行号和列号中较小值除以较大值),最直观的方法是先创建行和列的索引网格,再计算最小值除以最大值:
a = 1:3; [i, j] = meshgrid(a, a); % 生成3x3的行、列索引矩阵 result = min(i, j) ./ max(i, j);
运行这段代码后,result就是你想要的矩阵:
1.0000 0.5000 0.3333 0.5000 1.0000 0.6667 0.3333 0.6667 1.0000
方法2:利用广播和矩阵转置实现
如果你不想用meshgrid,也可以先生成非对称的i/j矩阵,再通过和它的转置取对应元素的最小/最大值来得到对称矩阵:
a = 1:3; temp = a(:) ./ a; % 生成i/j的矩阵:列向量除以行向量 result = min(temp, temp') ./ max(temp, temp');
这个方法的逻辑是先得到每行对应i/1, i/2, i/3的矩阵,再通过转置矩阵取min/max,最终生成对称的目标矩阵,结果和方法1完全一致。
小补充:如果是笔误想要非对称矩阵
如果你描述的预期矩阵是笔误,实际想要的是每行是i/1, i/2, i/3的非对称矩阵,那直接用a(:)./a就可以了,代码更简洁:
a = 1:3; result = a(:) ./ a;
得到的矩阵是:
1.0000 0.5000 0.3333 2.0000 1.0000 0.6667 3.0000 1.5000 1.0000
内容的提问来源于stack exchange,提问作者user30609
相关产品推荐
相关产品推荐

