以下是我遇到问题的简化版本。假设我有一个向量:
p=[1 5 10]
还有另一个
q=[.75 .85 .95]
我想要得到以下矩阵:
res=[1, .75; 1, .85; 1, .95; 5, .75; 5, .85; 5, .95; 10, .75; 10, .85; 10, .95]
这也被称为笛卡尔积。 我该怎么做?
以下是我遇到问题的简化版本。假设我有一个向量:
p=[1 5 10]
还有另一个
q=[.75 .85 .95]
我想要得到以下矩阵:
res=[1, .75; 1, .85; 1, .95; 5, .75; 5, .85; 5, .95; 10, .75; 10, .85; 10, .95]
这也被称为笛卡尔积。 我该怎么做?
这是一种方法:
[X,Y] = meshgrid(p,q);
result = [X(:) Y(:)];
输出结果为:
result =
1.0000 0.7500
1.0000 0.8500
1.0000 0.9500
5.0000 0.7500
5.0000 0.8500
5.0000 0.9500
10.0000 0.7500
10.0000 0.8500
10.0000 0.9500
result=sum(result,2)
才能符合要求。 - jpjacobs与@nibot所描述的方法类似,可以在Matlab中心文件交换中找到。
它将解决方案推广到任意数量的输入集。以下是简化版本的代码:
function C = cartesian(varargin)
args = varargin;
n = nargin;
[F{1:n}] = ndgrid(args{:});
for i=n:-1:1
G(:,i) = F{i}(:);
end
C = unique(G , 'rows');
end
cartesian(['c','d','e'],[1,2],[50,70])
ans =
99 1 50
99 1 70
99 2 50
99 2 70
100 1 50
100 1 70
100 2 50
100 2 70
101 1 50
101 1 70
101 2 50
101 2 70
这里有一个名为cartesian_product
的函数,它可以处理任何类型的输入,包括字符串数组,并返回一个表格,其中列名与输入变量的名称相匹配。不是变量的输入将被赋予类似于var1
、var2
等名称。
function tbl = cartesian_product(varargin)
names = arrayfun(@inputname, 1:nargin, 'UniformOutput', false);
for i = 1:nargin
if isempty(names{i})
names{i} = ['var' num2str(i)];
end
end
rev_args = flip(varargin);
[A{1:nargin}] = ndgrid(rev_args{:});
B = cellfun(@(x) x(:), A, 'UniformOutput', false);
C = flip(B);
tbl = table(C{:}, 'VariableNames', names);
end
>> x = ["a" "b"];
>> y = 1:3;
>> z = 4:5;
>> cartesian_product(x, y, z)
ans =
12×3 table
x y z
___ _ _
"a" 1 4
"a" 1 5
"a" 2 4
"a" 2 5
"a" 3 4
"a" 3 5
"b" 1 4
"b" 1 5
"b" 2 4
"b" 2 5
"b" 3 4
"b" 3 5
>> cartesian_product(1:2, 3:4)
ans =
4×2 table
var1 var2
____ ____
1 3
1 4
2 3
2 4