如何在MatLab中用这种组织求两个向量的所有可能的交点

efzxgjgh  于 2022-11-15  发布在  Matlab
关注(0)|答案(2)|浏览(233)

我有一个矩阵y和一个向量x,我需要找到x中的每个值到y中的每个向量的Map所产生的所有可能的向量。
这很难理解,让我们用一个例子来解释:,这里有一个例子,我有一个向量x = [0.7 + 0.7i; 0.7-0.7i];,这个矩阵应该是这个。这相当于等于Z = [x_1 0; x_2 0; 0 x_1; 0 x_2; x_1 x_1; x_1 x_2; x_2 x_2; x_2 x_1];。这意味着它根据y中的索引值将x中的每个值Map到Z行中。
这是我的尝试代码:清除所有;CLC;

y = [];
G = 2; 
v = 1 : G; 
for i = 1: G
    x=nchoosek(v,i);
    m = zeros(size(x,1),G-i);
y =[y ; x m];              % creat the matrix y 
end

x = [0.7 + 0.7i; 0.7-0.7i]; 

Z = []; s = zeros(G,1); 
for k=1:size(x,1)
for i=1:size(y,1) 
n=y(i,:);
n=n(n ~= 0);
s(n)=x(k); 
Z=[Z s];
s = zeros(G,1);
end
end

我的代码中的问题是矩阵Z显示逆,这意味着它从x获取输入x_1,然后将其Map到y中所有可能的值。例如,矩阵Z[x_1 0; 0 x_1; x_1 x_1 ….]开始,但应该是反转的,这意味着获取x中的每个值并将其Map,如上面的示例[x_1 0; x_2 0; x_3 0 …..]所示。第二个问题,当y包含多个非零值时,我的代码不能获得所有可能的向量,它只能得到[x_1 x_1; x_2 x_2];,但我不能Map其他可能性,如[x_1 x_2; x_2 x_1]等等。
我怎么才能解决这个问题呢?

更新

以下是更新后的问题,并有明确的描述。我有向量x和矩阵y,我需要按照矩阵y中每一行的索引填充矩阵z。例如,如果矩阵y中的第一行是[1 0][0 1];那么我将从x中获取所有可能的值,并将其放入z中,在本例中,y中行的数字为1。然后,对矩阵y中的第2行进行相同的处理,即[2 0][0 2];这意味着z中的第二列将填充x中所有可能的值。然后,可以填充z中的两列,这等价于y中的[1 2],因此它将从x中获取第一个值,并使用x中的所有其他可能值填充它,依此类推。z中的行不应重复。
矩阵Z与下面AboAmmar的答案完全相同,但使用向量较长的x和较大的矩阵y的循环IF会有点复杂。

jaxagkaj

jaxagkaj1#

正如您所描述的,y的每一行和相应的输出有4种不同的情况:
1.[0 1][1 0]=>[x*0]
1.[0 2][2 0]=>[0*x]
1.[1 2]=>[x1 x1;x1 x2;x2 x2;x2 x1]
1.[2 1]=>[x1 x1;x2 x1;x2 x2;x1 x2]
这些似乎并不遵循任何明显的规则。因此,最简单(但不是最聪明)的解决方案是使用if-else并从上面选择合适的案例。我们没有关于可能的索引的所有信息,或者可能发生像[1 1][2 2]这样的行,所以下面的解决方案绝不是穷尽的;如果将其他输入输入到y矩阵中,可能会发生令人惊讶的错误。

y = [];
G = 2;
v = 1 : G;
for i = 1: G
    x = nchoosek(v,i);
    m = zeros(size(x,1),G-i);
    y = [y ; x m];              % creat the matrix y
end

Z = [];
x = [0.7 + 0.7i; 0.7-0.7i]
for i = 1:size(y,1)
    r = y(i,:);
    if ismember(r, [1 0; 0 1], 'rows')
        Z(end+1:end+2,:) = [x [0; 0]];
    elseif ismember(r, [2 0; 0 2], 'rows')
        Z(end+1:end+2,:) = [[0; 0] x];
    elseif ismember(r, [1 2], 'rows')
        Z(end+1:end+4,:) = [x(1) x(1); x(1) x(2); x(2) x(2); x(2) x(1)];
    elseif ismember(r, [2 1], 'rows')
        Z(end+1:end+4,:) = [x(1) x(1); x(2) x(1); x(2) x(2); x(1) x(2)];
    end
end
Z =
   0.7000 + 0.7000i   0.0000 + 0.0000i
   0.7000 - 0.7000i   0.0000 + 0.0000i
   0.0000 + 0.0000i   0.7000 + 0.7000i
   0.0000 + 0.0000i   0.7000 - 0.7000i
   0.7000 + 0.7000i   0.7000 + 0.7000i
   0.7000 + 0.7000i   0.7000 - 0.7000i
   0.7000 - 0.7000i   0.7000 - 0.7000i
   0.7000 - 0.7000i   0.7000 + 0.7000i
mrwjdhj3

mrwjdhj32#

如果您在y中有固定的长度,例如,如果y中的每个向量都有一个值,而其他的值是零,或者两个非零值,等等,那么您的代码是有效的。
因此,您可以分别为每个长度编写代码,然后通过组合所有其他矩阵来构建矩阵Z

相关问题