【MATLAB】高维矩阵求和

本文围绕MATLAB高维矩阵展开,介绍了高维矩阵求和的原理,即压缩待求和维度长度为1并加和该维度上的数,通过多个例子进行说明。还阐述了MATLAB对矩阵的展示方式,强调理解高维矩阵特性对编程的重要性,最后指出MATLAB中矩阵降维需从最外层开始。

前言

之前就写过一篇关于高维矩阵求和的,现在再看的话,写得不是很清楚。

高维矩阵的求和

a=ones(2,3,4,5)

a(:,:,1,1) =

     1     1     1
     1     1     1


a(:,:,2,1) =

     1     1     1
     1     1     1


a(:,:,3,1) =

     1     1     1
     1     1     1


a(:,:,4,1) =

     1     1     1
     1     1     1


a(:,:,1,2) =

     1     1     1
     1     1     1
......

这样是创建了一个4维的矩阵。

sum(a,n)应该这样理解:a是目标矩阵,n是待求和的维度。显然n的取值范围是1 2 3 4。那么在某个维度求和的效果是什么呢?其实就是将这个维度的长度压缩为1。

上面有个表达“维度的长度”,大家注意区分维度长度

举例说明

例子1

>> sum(a,1)

为方便,直接进入到变量面板查看。
这是原始的a矩阵:
在这里插入图片描述
这是ans,也就是sum(a,1)的操作结果:
在这里插入图片描述

可以看到2 3 4维度都没有受到影响,只有1维度的长度被压缩到了1,当然这个维度上的数也被加和起来了,即2=1+1。

例子2

>> sum(a,2)

ans如下:
在这里插入图片描述
结果已经很显然了,维度2的长度被压缩到1,这个维度上的数也被加和起来,即3=1+1+1。

例子3

>> sum(a,3)

ans如下:

在这里插入图片描述
这个例子需要对比不同求和方式得到的ans才能体会更深刻。维度3的长度从4被压缩到1,所以维度1和2表示的2*3矩阵被叠加了4下,所以是

在这里插入图片描述

的形式。

例子4

>> sum(a,4)

ans如下:
在这里插入图片描述
同理,5=1+1+1+1+1。

小结

MATLAB的对于矩阵的展示是这样的:前两个维度是通过平面排布的方式展示出来,更高维度则是通过索引展示出来。

  • 通过平面排布的方式展示出来
    意思就是维度1表示多少行,维度2表示多少列,而行列是用一种直观的平面排布,你甚至可以没有“维度”的概念。这也是我们平时最常说的:几行几列的矩阵。

在这里插入图片描述

  • 通过索引展示出来
    意思就是更高维度没法在一个平面中展示出来,平面中展示的永远是维度1和2的信息,维度3以及更高则通过索引比如下面的(3,4)展示。
    所以通过(:,:,3,4)我们可以得到如下信息:维度1 2 之外还有两个维度,整个矩阵是4维的;a(:,:,3,4)是维度3的索引值=3以及维度4的索引值=4对应的矩阵。

在这里插入图片描述
编程的过程中是会涉及到高维矩阵的,比如下面这个约束:

e s , t , j , i v = e s , t − 1 , j , i v + p s , t , j , i v , c h η j , i v , c h − 1 η j , i v , d i s p s , t , j , i v , d i s ∀ s , t , j , i e_{s,t,j,i}^v = e_{s,t - 1,j,i}^v + p_{s,t,j,i}^{v,ch}\eta _{j,i}^{v,ch} - {1 \over {\eta _{j,i}^{v,dis}}}p_{s,t,j,i}^{v,dis}{\rm{ }}\forall s,t,j,i es,t,j,iv=es,t1,j,iv+ps,t,j,iv,chηj,iv,chηj,iv,dis1ps,t,j,iv,diss,t,j,i

最简单的方法其实是用4层循环,但这样效率低,没有充分利用MATLAB善于进行矩阵计算的特性。但是要把这个约束尽可能地写成矩阵形式(可以和for循环配合使用),理解清楚MATLAB高维矩阵的特性还是很有必要的。

另一些问题

>> a=ones(2,3,4,5);
b=sum(a,4);

在这里插入图片描述
b直接变成3维了。

>> a=ones(2,3,4,5);
b=sum(a,3);

在这里插入图片描述
在这里插入图片描述
b从属性上来看还是4维,但实际上第3个维度已经没有意义了。
我们在此基础上继续操作:

>> b=sum(b,4);

在这里插入图片描述
可以看到b直接变成2维了!由此我们可以看出,MATLAB中矩阵降维得从最外层开始降,不然会被“卡住”!

<think>在MATLAB中,对矩阵的每行求和可以使用`sum`函数,并指定维度为2(行方向)。假设有一个矩阵A,我们想要计算每一行的元素之和,结果是一个列向量,其中每个元素是原矩阵对应行的和。示例:如果矩阵A是:A=[1,2,3;4,5,6;7,8,9]那么对每行求和的结果应该是:[1+2+3;4+5+6;7+8+9]=[6;15;24]代码实现:```matlab%定义矩阵AA=[1,2,3;4,5,6;7,8,9];%对每行求和,指定维度为2rowSums=sum(A,2);%显示结果disp(rowSums);```输出:61524解释:sum函数的第一个参数是矩阵,第二个参数是维度。当第二个参数为1时,表示对每列求和(按列方向,即垂直方向);为2时,表示对每行求和(按行方向,即水平方向)。另外,如果不指定维度,默认是按列求和(即维度1)。特殊情况:如果矩阵是行向量,那么对每行求和就是整个向量的和(因为只有一行),结果是一个标量。如果矩阵是列向量,那么对每行求和的结果就是它本身(因为每行只有一个元素)。对于高维矩阵,可以指定任意维度进行求和。另外,也可以使用其他方法,比如循环,但使用内置函数`sum`是最高效的。下面是一个使用循环的示例(不推荐,仅用于教学):```matlab%获取矩阵的行数和列数[m,n]=size(A);%初始化一个全0列向量rowSums=zeros(m,1);%遍历每一行fori=1:m%对当前行的所有元素求和rowSums(i)=sum(A(i,:));end```但是,在MATLAB中,使用向量化操作(即内置函数)通常比循环更高效,尤其是在处理大型矩阵时。另外,如果矩阵中包含NaN(非数字)值,可以使用`nansum`函数(需要StatisticsandMachineLearningToolbox)来忽略NaN进行求和:```matlabrowSums=nansum(A,2);```如果没有该工具箱,可以使用以下方法:```matlab%将NaN替换为0,然后求和A_temp=A;A_temp(isnan(A_temp))=0;rowSums=sum(A_temp,2);```总结:推荐使用`sum(A,2)`对矩阵每行求和。相关问题:1.如何对矩阵每列求和?2.如果矩阵中有NaN,如何忽略NaN对每行求和?3.如何计算矩阵每行的平均值?4.如何计算矩阵每行的累积和?</think>### MATLAB 矩阵每行求和详解 在 MATLAB 中,对矩阵每行求和有以下几种常用方法: #### 1. 使用 `sum` 函数(推荐) ```matlab % 创建示例矩阵 A = [1, 2, 3; 4, 5, 6; 7, 8, 9]; % 对每行求和 row_sums = sum(A, 2); % 第二个参数 2 表示按行操作 % 显示结果 disp('矩阵 A:'); disp(A); disp('每行求和结果:'); disp(row_sums); ``` **输出结果:** ``` 矩阵 A: 1 2 3 4 5 6 7 8 9 每行求和结果: 6 15 24 ``` #### 2. 使用 `dot` 函数(点积技巧) ```matlab % 创建一个全为 1 的列向量 ones_vector = ones(size(A, 2), 1); % 计算行和 row_sums = A * ones_vector; ``` #### 3. 使用 `arrayfun`(适用于复杂操作) ```matlab % 对每行应用求和函数 row_sums = arrayfun(@(i) sum(A(i, :)), 1:size(A, 1))'; ``` #### 4. 使用 `cumsum` 和索引(部分求和) ```matlab % 计算累积和并取最后一行 cumulative_sum = cumsum(A, 2); row_sums = cumulative_sum(:, end); ``` ### 方法对比表 | 方法 | 优点 | 缺点 | 适用场景 | |------|------|------|----------| | `sum(A, 2)` | 最简洁高效 | 无 | 常规行求和 | | `A * ones_vector` | 数学表达清晰 | 需创建辅助向量 | 数学运算上下文 | | `arrayfun` | 可扩展性强 | 效率较低 | 需要每行复杂计算 | | `cumsum` | 可获取中间结果 | 效率最低 | 需要累积和 | ### 特殊场景处理 #### 1. 处理 NaN 值 ```matlab % 创建含 NaN 的矩阵 B = [1, NaN, 3; 4, 5, NaN; NaN, 8, 9]; % 忽略 NaN 求和 row_sums_nan = sum(B, 2, 'omitnan'); disp('忽略 NaN 的求和结果:'); disp(row_sums_nan); ``` #### 2. 处理大型稀疏矩阵 ```matlab % 创建稀疏矩阵 sparse_mat = sparse([1, 2, 3], [1, 2, 3], [10, 20, 30], 1000, 1000); % 高效行求和 sparse_row_sums = sum(sparse_mat, 2); ``` #### 3. 条件求和 ```matlab % 只对大于 5 的元素求和 C = [1, 6, 3; 7, 5, 8; 4, 9, 2]; conditional_sum = sum(C .* (C > 5), 2); disp('只对大于 5 的元素求和:'); disp(conditional_sum); ``` ### 性能优化建议 1. **向量化操作优先**:尽量使用 `sum(A, 2)` 而不是循环 2. **避免内存复制**:对大矩阵使用原地操作 3. **利用稀疏性**:对稀疏矩阵使用专用函数 4. **并行计算**:对超大矩阵使用 `parfor`(需要 Parallel Computing Toolbox) ```matlab % 并行计算示例 row_sums_parallel = zeros(size(A, 1), 1); parfor i = 1:size(A, 1) row_sums_parallel(i) = sum(A(i, :)); end ``` ### 应用场景示例 ```matlab % 数据标准化:每行元素除以行和 normalized_A = A ./ row_sums; % 计算行均值 row_means = mean(A, 2); % 计算每行元素占比 percentage_matrix = A ./ sum(A, 2) * 100; ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值