现在我不止一次需要在MATLAB中生成所有可能的两个向量对,我用for循环来做,这占用了相当多的代码行,即。
vec1 = 1:4;
vec2 = 1:3;
i = 0;
pairs = zeros([4*3 2]);
for val1 = vec1
for val2 = vec2
i = i + 1;
pairs(i,1) = val1;
pairs(i,2) = val2;
end
end
会产生...
必须有一个更好的方法来做到这一点,这是更MATLAB的风格?
注意:nchoosek
不做我需要的反向对(即2 1
和1 2
),我不能只是反向和附加nchoosek
输出,因为对称对将被包括两次。
9条答案
按热度按时间sf6xfgos1#
试试看
请看MESHGRID documentation。虽然这并不完全是那个函数的用途,但如果你眯着眼睛看它很有趣,你所要求的正是它的作用。
chy5wohz2#
您可以使用
wqsoz72f3#
您可以使用
repmat
复制矩阵,然后使用reshape
将结果转换为列向量。当然,你可以从上面的例子中去掉所有的中间变量。
kcrjzv8t4#
另一种收集方法:
dgiusagp5#
您正在寻找的是cartesian product
cartprod是实现它的函数。你可以在linear-algebra包中找到它,所以你需要做:
iklwldmw6#
您可以使用普通的旧矩阵运算,例如在
**编辑:**这是Octave语法,MATLAB看起来像这样:
在这两种情况下,结果将是
4jb9z9bj7#
从MATLAB R2023a开始,您可以使用combinations函数来完成此操作。
结果是一个表。当所有的数据类型都兼容时(就像这里的情况一样),你可以得到这样的矩阵
daolsyd08#
这里有一个更像MATLAB的方法来找到组合。这个方法也可以很容易地扩展到2个以上的向量(以及非数字组合):
hfwmuf9z9#
从版本R2015a开始,您可以使用
repelem
和repmat
执行此操作:这种类型的解决方案避免了一些其他解决方案(例如基于
meshgrid
的解决方案)所需的额外中间变量,这可能会导致较大向量的内存问题。