You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:45:22