matlab - 如何编写依赖于其他矢量化表达式的矢量化表达式?

标签 matlab vectorization

例如,如果我有三个表达式:ABC,如下所示:

A(i+1) = A(i) + C(i).k
B(i+1) = B(i) + A(i).h
C(i+1) = A(i) + B(i)

其中 kh 是一些常量,mn 是所需的 大小Ci 是上一个得到的值,i+1 是下一个值。现在,如果我使用 for 循环,那么我可以将其编码为:

A(1)= 2;
B(1)= 5;
C(1)= 3;
for i=1:10
    A(i+1) = A(i) + C(i)*2;
    B(i+1) = B(i) + A(i)*3;
    C(i+1) = A(i) + B(i);
end

而且效果很好。但我想以向量形式对其进行编码,就像不必使用循环一样。但问题是我不知道如何绕过以下依赖:

  • A 其先前的值和先前的 C
  • B 在其上的先前值和 A
  • 的先前 C
  • CAB
  • 的先前值

最佳答案

这是一种基于矩阵的方法来获取 [A;B;C] 向量的第 n 值。我不会确切地称之为矢量化,但这可以大大加快您的速度:

[A,B,C] = deal(zeros(11,1));
A(1)= 2;
B(1)= 5;
C(1)= 3;

%% // Original method
for k=1:10
  A(k+1) = A(k) + C(k)*2;
  B(k+1) = B(k) + A(k)*3;
  C(k+1) = A(k) + B(k);
end

%% // Matrix method:
%// [ A ]     [1  0  2][ A ]
%// | B |  =  |3  1  0|| B |
%// [ C ]     [1  1  0][ C ]
%//      i+1                i
%// 
%// [ A ]     [1  0  2][ A ]        [1  0  2]   ( [1  0  2][ A ] )
%// | B |  =  |3  1  0|| B |    =   |3  1  0| * ( |3  1  0|| B | )
%// [ C ]     [1  1  0][ C ]        [1  1  0]   ( [1  1  0][ C ] )
%//      i+2                i+1                                 i

%// Thus, this coefficient matrix taken to the n-th power, multiplied by the input 
%// vector will yield the values of A(n+1), B(n+1), and C(n+1):
M = [1 0 2
     3 1 0
     1 1 0];
isequal(M^10*[A(1);B(1);C(1)],[A(11);B(11);C(11)])

实际上,您可以使用 M 的适当幂(正或负)来获得任何 [A,B,C]n来自任何 [A,B,C]k ...

关于matlab - 如何编写依赖于其他矢量化表达式的矢量化表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35034584/

相关文章:

带键盘控制的 MATLAB GUI 按钮

c++ - 从脉冲信号、离散信号和连续信号中获取实际值

c++ - (如何)我可以使用 openmp 对 `std::complex<double>` 进行矢量化吗?

Matlab - 两个以上输入的单例扩展

matlab - 如何根据某些条件删除 Matlab 中的矩阵行?

matlab - 如何在 MATLAB 上查找图像的雾度?

Matlab:从矩阵中删除对角线并进行改革

python - 复杂 Numpy 脚本的矢量化实现

python - 矢量化 numpy.einsum

python - 向量化前瞻性函数 pandas 数据框