MATLAB中批量处理矩阵
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MATLAB中批量处理矩阵相关的知识,希望对你有一定的参考价值。
我在MATLAB中创建了例如:d1,d2,d3......这样名称的矩阵,现在我想用循环语句批量处理它们,这些矩阵是怎么表示的(它们的名称的表示的格式是怎么样的)?麻烦给一个例子(比如从每个矩阵中取出(1,1)的值),谢谢。
例子:d1=[1 2 3;
4 5 6]
[m,n]=size(d1) % m为矩阵行数 n为矩阵列数 即d1为2行3列矩阵
for i=1:m % 做循环 取矩阵中的每一个元素 进行运算
for j=1:n
d(i,j)=d1(i,j)*d1(i,j); %取d1中的第i行 第j列元素 做平方运算
end
end
d
-----------------------------------
例子的结果输出:
d1 =
1 2 3
4 5 6
m =
2
n =
3
d =
1 4 9
16 25 36 参考技术A 等价于:
eval(sprintf('c%d = a%d\n', [1:2; 1:2]))
不要这样定义变量,你应该定义三维矩阵a,或元胞数组a。
比如元胞数组a,就可以这样访问数据:
ai(:, 2) 参考技术B f(x) =∫(1->x) ln(1+t)/t dt
f(1/x) = ∫(1->1/x) ln(1+t)/t dt
let
u = 1/t
du = -(1/t^2) dt
dt = -du/u^2
∫(1->1/x) ln(1+t)/t dt
=∫(1->x) [ln(1+1/u)/(1/u) ] .[-du/u^2]
=-∫(1->x) [ln(1+1/u)/u ] .du
=-∫(1->x) [ln(1+1/t)/t ] dt
=-∫(1->x) ln[(t+1)/t] /t dt
f(x) + (1/x)
=∫(1->x) ln(1+t)/t dt -∫(1->x) ln[(t+1)/t] /t dt
=∫(1->x) lnt/t dt
=(1/2)[ (lnt)^2] |(1->x)
=(1/2)(lnx)^2 参考技术C 例如:
d1 = [2,1;0.2,3];
d2 = [3,4;0.25,1];
for i = 1:2
str = ['d',num2str(i),'(1,1)'];
disp(eval(str));
end 参考技术D
通过 Matlab 中的移动索引移动矩阵中的批量行
【中文标题】通过 Matlab 中的移动索引移动矩阵中的批量行【英文标题】:Shift bulk rows in a matrix by a shifting index in Matlab 【发布时间】:2019-07-21 14:48:23 【问题描述】:请注意,我使用的是 Matlab R2013b。所以,我有一个 10x2 大小的玩具输入矩阵:
inputM = [NaN 4 7 NaN 9 NaN NaN NaN NaN NaN; NaN NaN 8 10 2 NaN 3 NaN NaN NaN]
我有非NaN值位于每列的最低和最高位置:
lowest_idx = [2 3]
highest_idx = [5 7]
我想根据移动索引shift_idx = [3 2]
在最低和最高位置之间向下移动批量行。我需要获得的输出矩阵看起来像
outputM = [NaN NaN NaN NaN 4 7 NaN 9 NaN NaN; NaN NaN NaN NaN 8 10 2 NaN 3 NaN]
我可以像这样使用for loop
来做到这一点:
for i = 1:length(shift_idx)
inputM(lowest_idx(i)+shift_idx(i):highest_idx(i)+shift_idx)(i),i) = inputM(lowest_idx(i):highest_idx(i),i);
inputM(1:lowest_idx(i)+1,i) = nan;
end
但是,我的真实矩阵有超过 100 万列,所以我想要一个更有效的解决方案。任何人都知道如何在没有for loop
的情况下做到这一点?
【问题讨论】:
【参考方案1】:circshift
正是这样做的。
outputM = circshift(inputM.', shift_idx).';
【讨论】:
@Sadar Usama 我尝试了您的解决方案,但outputM
中的列被互换了,这是我不想要的。我只想要行移位,而不是列,因为我分别处理行。我设法使用circshift
做到这一点的唯一方法仍然是使用for loop
,例如for i = 1:numel(n) outputM(:,i) = circshift(inputM(:,i), shift_idx(i)); end
@Bowecho 你的代码给出了这个输出:[NaN 4; NaN NaN]
你确定你想要这个吗?我的代码给出了您在原始问题中编写的输出【参考方案2】:
如果您可以访问 Matlab R2016a,请使用 circshift。例如,
outputM = circshift(inputM, shift_idx);
如果您没有circshift
的现代版本,则需要使用旧版本两次。沿着每个维度一次。例如,
for i = 1:numel(size(shift_idx))
outputM = circshift(inputM, shift_idx(i),i);
end
警告:以上内容并非旨在完全按照您的要求完成。但是试一试。你会看到它的作用。
在您的特定问题中,由于您对每一行的处理方式不同,因此这种转变对计算的要求会更高。您仍然可以使用circshift
。例如,
outputM = [circshift(inputM(:,1), shift_idx(1),2); circshift(inputM(:,1), shift_idx(2),2)];
请务必先阅读文档并先对简单示例进行测试。您还需要了解未填充元素的移动行为。
【讨论】:
以上是关于MATLAB中批量处理矩阵的主要内容,如果未能解决你的问题,请参考以下文章