matlab 矩阵矢量化编程

本文探讨了Matlab及Python中高效进行矩阵运算的方法,包括如何利用循环和布尔索引来实现矩阵操作,以及如何使用对角矩阵和其他高级功能。通过具体的数学公式和代码示例,展示了不同场景下的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如我们想验证:

nxnxTn=XXT

其中xn,n=1,,N分别表示X的每一列

% 循环的做法
T = zeros(size(X));
for i = 1:size(X, 2),
    T = T+X(:, i)*X(:, i)';
end
% 矩阵运算的做法
i = 1:size(X, 2);
X(:, i)*X(:, i)'

1. 避免使用判断,避免使用循环

gσ(x)=12[1(x/σ)2]2,0,|x|σotherwise
x = -5:.001:5;
sigma = 0.75;
y = zeros(size(x));
y = (1-(x/sigma).^2).^2/2;
y(abs(x)>sigma)=0;
plot(x, y)

matlab有强大的布尔索引,python还有强大的list comprehension呢,虽然接下来的python代码并未使用list comprehension,这里只是想说,语言的存在是有其存在的合理性的,大家各有其适定的场所:

import numpy as np
import matplotlib.pyplot as plt

s = .75
x = np.arange(-5, 5, .001)
y = np.where(abs(x) < s, (1-(x/s)**2)**2/2, 0)
plt.plot(x, y, c='r', lw=2)
plt.show()

2. 创建对角对阵

根据向量创建对角矩阵:

>> diag([1/2 1/3 1/4])
ans =
    0.5000         0         0
         0    0.3333         0
         0         0    0.2500

diag有多份重载,

  • (1)根据一维向量创建对角矩阵
  • (2)提取矩阵的对角线元素为一维向量(列向量)

3. 找不同

function a = sigmoid(z)
a = 1/(1+exp(-z));
end

function a = sigmoid(z)
a = 1./(1+exp(-z));
end

二者唯一的不同正在于,做除法运算时,上边的函数没有点,下边的函数有点,这就导致了,第一个函数不可以接受向量或者矩阵,而第二个函数可以。

4. Rosenbrock function

f(x)=i=1N1100(xi+1x2i)2+(1xi)2wherex=[x1,,xN]RN
f = sum(100*(x(2:end)-x(1:end-1).^2).^2+(1-x(1:end-1)).^2);

4. 三维矩阵的索引

patches = zeros(patchSize*patchSize, numPatches);
for i = 1:numPatches,
    rnd_patch = images(row_idx(i):row_idx(i)+patchSize-1, col_idx(i):col_idx(i)+patchSize-1, img_idx(i));
    patches(:, i) = rnd_patch(:);
end

改造为矢量形式:

patches = reshape(images(row_idx:row_idx+patchSize-1, col_idx:col_idx+patchSize-1, img_idx), patchSize*patchSize, numPatches);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五道口纳什

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值