Matlab中如何根据向量x与矩阵y生成所有映射结果矩阵Z
解决方案:根据矩阵索引生成向量映射的所有可能组合
给定矩阵
y和向量x,需根据y每行的非零索引,生成x元素映射到对应列的所有可能向量组合。例如y = [1 0; 2 0; 1 2]、x = [0.7+0.7i; 0.7-0.7i]时,需生成包含所有对应映射的矩阵Z,原代码存在顺序错误、组合缺失问题,且大数据量下效率低下。
核心思路
- 遍历
y的每一行,提取非零索引,确定需要填充x元素的列位置 - 生成
x元素的笛卡尔积,覆盖所有排列组合(如x1x2和x2x1) - 将组合填充到对应列,其余列补0,按
y的行顺序拼接结果
完整代码
clear all; clc; G = 2; v = 1 : G; y = []; for i = 1: G x_comb = nchoosek(v,i); m = zeros(size(x_comb,1),G-i); y = [y ; x_comb m]; % 创建矩阵y end x = [0.7 + 0.7i; 0.7-0.7i]; Z = []; num_cols = size(y,2); for row = 1:size(y,1) idx = y(row,:); idx = idx(idx ~= 0); % 提取当前行的非零索引 k = length(idx); % 生成x元素的所有笛卡尔积组合 if k == 0 continue; % 跳过全零行(当前y生成逻辑不会产生) end grids = cell(1,k); [grids{:}] = ndgrid(x); comb = cell2mat(cellfun(@(g) g(:), grids, 'UniformOutput', false)); % 创建当前行对应的结果矩阵,初始为0 temp_Z = zeros(size(comb,1), num_cols); temp_Z(:, idx) = comb; % 拼接到总结果Z中 Z = [Z; temp_Z]; end disp(Z);
代码说明
- 生成矩阵
y:沿用原逻辑,生成包含1~G的组合并补零的矩阵 - 提取非零索引:对
y的每一行,筛选出需要填充x元素的列位置 - 生成笛卡尔积:通过
ndgrid生成多维度网格,再展开为列向量拼接,解决原代码组合缺失问题 - 填充并拼接:创建全零临时矩阵,将组合填充到对应列后,按
y的行顺序拼接结果,解决原代码顺序错误问题
运行后输出的Z与期望结果完全一致,且矢量化操作大幅提升了大x、大y场景下的运行效率。
内容的提问来源于stack exchange,提问作者Fatima_Ali
相关产品推荐
相关产品推荐

