matlab - 将矩阵列与从最后一列开始的递减元素相乘
问题描述
我有一个具有以下形状的矩阵:
A = [1 2 3;
4 5 6;
7 8 9]
现在我想从最后一列开始,将该列乘以一个数字,然后减少数字并移动到下一列。
因此,如果我们从数字 1 开始并使用 for step 0.2 修改所有列:
Anew = [1*0.6 2*0.8 3*1;
4*0.6 5*0.8 6*1;
7*0.6 8*0.8 9*1]
或者对于第二个示例,我们从 0.9 开始,以 0.1 作为步骤并修改 3 列:
B = [1 2 3 4;
5 6 7 8;
9 10 11 12;
13 14 15 16]
并得到:
Bnew = [1 2*0.7 3*0.8 4*0.9;
5 6*0.7 7*0.8 8*0.9;
9 10*0.7 11*0.8 12*0.9;
13 14*0.7 15*0.8 16*0.9]
矩阵的列数可能会有所不同,我想设置起始编号、结束编号、步骤编号和要修改的列数。
解决方案
您所描述的可以通过matlab R2016b 及更高版本中的广播元素乘法来实现。
假设您的输入是 matrix A
、 start value start
、 step sizestep
和 number n
。您可以从构建要乘以的因子开始。我将假设,当n > size(A, 2)
您只想使用n
第一步而不是出错时:
k = size(A, 2);
n = min(n, k);
factors = ones(1, k);
factors(1 + k - n:end) = linspace(start - (n - 1) * step, start, n);
现在您可以将矩阵相乘:
result = A .* factors;
该解决方案具有极其简单且完全矢量化的优点。
如果您有旧版本的 MATLAB,请改为执行以下操作:
result = A .* repmat(factors, size(A, 1), 1);
或者使用托尼的把戏:
result = A .* factors(ones(3, 1), :)
推荐阅读
- javascript - 尝试使用网络应用程序在谷歌驱动器上上传文档时出现空白页
- logstash-grok - logstash 的两个配置不能一起工作
- sql - 如何在 Oracle 中获取 URL 友好的字符串?
- angular - Angular 7 - 注入服务始终为空
- sql-server - 一个具有一个主键的表和另一个具有两个主键的表之间是否存在关系?
- typescript - 将内部属性的键提升为其自己的类型定义
- c# - ManateeSerializer 缺少方法
- java - 如何控制 id 等于未知数量的变量 sql 查询的位置?
- python - Boto3 CloudWatch - 具有多个指标和数学表达式的 put_metric_alarm
- android - 如何暂时取消 LinearLayout 中包含的按钮来监听点击?