如何组织数组数组中的参数值以输入到函数中?
How to organize parameter values in an array of arrays to input into a function?
希望我能清楚地表达我的问题:我有一个概率密度函数,它是两个分布的卷积。我的函数要求我为每个分布提供一个均值和方差对。我正在尝试组织我想要评估的均值和方差对的所有不同组合。
我做的第一件事就是使用以下代码配对:
mm=linspace(.1, 1, 2); % mean values
vv=linspace(.1, 2, 2); % variance values
N=length(mm);
n=length(vv);
for i = 1:N
for j = 1:n
p{(i-1)*N+j} = [mm(i), vv(j)];
end
end
所以我的配对是 p{1} = [.1, .1], p{2} = [.1, 2], p{3} = [1., .1], p{4} = [1.,2.]
。现在,我坚持形成这些对的所有可能组合,要求我没有任何 'repeats' - 我重复的意思是我的 PDF 不关心我是否喂它 [p{1}, p{2}]
或 [p{2}, p{1}]
- 它将评估相同(基本上,我的 PDF 是退出时间的分布,我只关心总时间,这就是顺序无关紧要的原因)。
基本上,我想要一个如下所示的数组:
P(1) = [p{1}, p{1}], P(2) = [p{1}, p{2}],
P(3) = [p{1}, p{3}], P(4) = [p{1}, p{4}],
P(5) = [p{2}, p{2}], P(6) = [p{2}, p{3}],
P(7) = [p{2}, p{4}], P(8) = [p{3}, p{3}],
P(9) = [p{3}, p{4}], P(10) = [p{4}, p{4}]
我正在尝试这样做,但很难建立索引
for i = 1:N*n
for j = i:N*n
P = [p{i},p{j}];
end
end
所以一旦我解决了这个问题,我就可以将所有这十种组合提供给我的 PDF 进行评估。这让我想到了另一个问题——我的 PDF 是以这样一种方式编写的,它需要 4 个参数 function Y=myPDF(m1,v1,m2,v2)
。例如,我如何将 [p{1},p{2}]
分开,以便将 p{1}
的均值和方差分配给 m1,v1
等等。
使用 nchoosek
, sort
, and unique
的索引方法:
mm=linspace(.1, 1, 2)'; % mean values
vv=linspace(.1, 2, 2)'; % variance values
N=length(mm);
n=length(vv);
p = cell(N, n);
for i = 1:N
for j = 1:n
p{(i-1)*N+j} = [mm(i), vv(j)];
end
end
temp = nchoosek([1:N*n, 1:N*n], 2); % Get all the permutations
temp = sort(temp, 2); % Sort each permutation by row for an easier unique call
idx = unique(temp, 'rows'); % Get all unique permutations
然后您可以使用这些索引来引用您的数据:
P = cell(length(idx), 1);
for ii = 1:length(idx)
P{ii} = {p(idx(ii, 1)), p(idx(ii, 2))};
end
可能有更好的方法来做到这一点,但这是一个起点。
编辑:对于问题的第二部分,您可以使用 beautiful 代码行将所有内容转储到双数组中:
test = [reshape([p{idx(:,1)}], 2, [])', reshape([p{idx(:,2)}], 2, [])'];
哪个returns:
test =
0.1000 0.1000 0.1000 0.1000
0.1000 0.1000 0.1000 2.0000
0.1000 0.1000 1.0000 0.1000
0.1000 0.1000 1.0000 2.0000
0.1000 2.0000 0.1000 2.0000
0.1000 2.0000 1.0000 0.1000
0.1000 2.0000 1.0000 2.0000
1.0000 0.1000 1.0000 0.1000
1.0000 0.1000 1.0000 2.0000
1.0000 2.0000 1.0000 2.0000
希望我能清楚地表达我的问题:我有一个概率密度函数,它是两个分布的卷积。我的函数要求我为每个分布提供一个均值和方差对。我正在尝试组织我想要评估的均值和方差对的所有不同组合。
我做的第一件事就是使用以下代码配对:
mm=linspace(.1, 1, 2); % mean values
vv=linspace(.1, 2, 2); % variance values
N=length(mm);
n=length(vv);
for i = 1:N
for j = 1:n
p{(i-1)*N+j} = [mm(i), vv(j)];
end
end
所以我的配对是 p{1} = [.1, .1], p{2} = [.1, 2], p{3} = [1., .1], p{4} = [1.,2.]
。现在,我坚持形成这些对的所有可能组合,要求我没有任何 'repeats' - 我重复的意思是我的 PDF 不关心我是否喂它 [p{1}, p{2}]
或 [p{2}, p{1}]
- 它将评估相同(基本上,我的 PDF 是退出时间的分布,我只关心总时间,这就是顺序无关紧要的原因)。
基本上,我想要一个如下所示的数组:
P(1) = [p{1}, p{1}], P(2) = [p{1}, p{2}],
P(3) = [p{1}, p{3}], P(4) = [p{1}, p{4}],
P(5) = [p{2}, p{2}], P(6) = [p{2}, p{3}],
P(7) = [p{2}, p{4}], P(8) = [p{3}, p{3}],
P(9) = [p{3}, p{4}], P(10) = [p{4}, p{4}]
我正在尝试这样做,但很难建立索引
for i = 1:N*n
for j = i:N*n
P = [p{i},p{j}];
end
end
所以一旦我解决了这个问题,我就可以将所有这十种组合提供给我的 PDF 进行评估。这让我想到了另一个问题——我的 PDF 是以这样一种方式编写的,它需要 4 个参数 function Y=myPDF(m1,v1,m2,v2)
。例如,我如何将 [p{1},p{2}]
分开,以便将 p{1}
的均值和方差分配给 m1,v1
等等。
使用 nchoosek
, sort
, and unique
的索引方法:
mm=linspace(.1, 1, 2)'; % mean values
vv=linspace(.1, 2, 2)'; % variance values
N=length(mm);
n=length(vv);
p = cell(N, n);
for i = 1:N
for j = 1:n
p{(i-1)*N+j} = [mm(i), vv(j)];
end
end
temp = nchoosek([1:N*n, 1:N*n], 2); % Get all the permutations
temp = sort(temp, 2); % Sort each permutation by row for an easier unique call
idx = unique(temp, 'rows'); % Get all unique permutations
然后您可以使用这些索引来引用您的数据:
P = cell(length(idx), 1);
for ii = 1:length(idx)
P{ii} = {p(idx(ii, 1)), p(idx(ii, 2))};
end
可能有更好的方法来做到这一点,但这是一个起点。
编辑:对于问题的第二部分,您可以使用 beautiful 代码行将所有内容转储到双数组中:
test = [reshape([p{idx(:,1)}], 2, [])', reshape([p{idx(:,2)}], 2, [])'];
哪个returns:
test =
0.1000 0.1000 0.1000 0.1000
0.1000 0.1000 0.1000 2.0000
0.1000 0.1000 1.0000 0.1000
0.1000 0.1000 1.0000 2.0000
0.1000 2.0000 0.1000 2.0000
0.1000 2.0000 1.0000 0.1000
0.1000 2.0000 1.0000 2.0000
1.0000 0.1000 1.0000 0.1000
1.0000 0.1000 1.0000 2.0000
1.0000 2.0000 1.0000 2.0000