在Matlab、Octave中创建矩阵及生成独热编码矩阵的方法
嘿,我来帮你搞定这两个Matlab/Octave的矩阵操作问题,这俩工具的语法大部分是通用的,下面分开说清楚:
1. 在Matlab和Octave中创建矩阵的常用方法
这里列举几种最常用的方式,覆盖大部分场景:
- 直接手动赋值:适合小矩阵,直接用方括号包裹,行内元素用空格或逗号分隔,行与行用分号分隔
% 创建一个2x3的矩阵 A = [1 2 3; 4 5 6]; - 生成特殊矩阵:用内置函数快速生成全0、全1、单位矩阵等
% 3x3全0矩阵 B = zeros(3,3); % 2x4全1矩阵 C = ones(2,4); % 5x5单位矩阵(对角线为1,其余为0) D = eye(5); - 随机矩阵:生成随机数填充的矩阵
% 生成3x3的0到1之间的均匀随机矩阵 E = rand(3,3); % 生成2x5的标准正态分布随机矩阵(均值0,方差1) F = randn(2,5); - 从向量扩展生成:如果已有向量,可以通过拼接或重复来生成矩阵
v = [1,2,3]; % 将向量v重复3次作为行,生成3x3矩阵 G = repmat(v, 3, 1); % 将向量v作为列重复2次,生成3x2矩阵 H = repmat(v', 1, 2);
2. 将向量V转换为独热编码矩阵W
你要的其实是独热编码(One-Hot Encoding),把每个类别值转换成对应位置为1的行向量。这里给你三种高效的实现方法,适合处理5000行的大向量:
方法一:直观的索引赋值法
这种方法逻辑清晰,容易理解,适合新手:
% 假设V是已经存在的5000x1向量 n = length(V); W = zeros(n, 10); % 先创建全0的n行10列矩阵 % 生成每个元素对应的索引位置 row_idx = 1:n; col_idx = V; % 把对应位置设为1 W(sub2ind(size(W), row_idx, col_idx)) = 1;
原理:sub2ind把行列索引转换成矩阵的线性索引,然后直接给这些位置赋值1。
方法二:更高效的稀疏矩阵转全矩阵
如果你的向量很大(比如5000行),用稀疏矩阵初始化会更节省内存,然后转成全矩阵:
W = full(sparse(1:n, V, 1, n, 10));
原理:sparse函数直接生成只有指定位置为1的稀疏矩阵,再用full转成普通的全矩阵,这种方法在处理大规模数据时速度更快。
方法三:简洁的单位矩阵索引法
利用单位矩阵的特性,一行代码搞定:
W = eye(10)(V, :);
原理:eye(10)是10x10的单位矩阵,用V作为行索引去取,就会得到每个V元素对应的独热行向量,自动拼接成5000x10的矩阵。这个写法在Matlab和Octave中都能正常运行。
内容的提问来源于stack exchange,提问作者Andrew M
相关产品推荐
相关产品推荐

