如何在 MATLAB 中有效地标准化向量?有相关的内置函数吗? [关闭]

2024-01-06

我在 MATLAB 中对向量 V 进行归一化,如下所示:

normalized_V = V/norm(V);

然而,这是在 MATLAB 中标准化向量的最优雅(有效)的方法吗?


您建议的原始代码是最好的方法。

Matlab 非常擅长诸如此类的向量化运算,至少对于大向量而言是如此。

内置的范数函数非常快。以下是一些计时结果:

V = rand(10000000,1);
% Run once
tic; V1=V/norm(V); toc           % result:  0.228273s
tic; V2=V/sqrt(sum(V.*V)); toc   % result:  0.325161s
tic; V1=V/norm(V); toc           % result:  0.218892s

这里第二次计算 V1 只是为了确保第一次调用时没有重要的缓存惩罚。

此处的计时信息是在 Windows 上使用 R2008a x64 生成的。


EDIT:

根据新手的建议修改答案(参见评论)。矩阵数学(勉强)获胜:

clc; clear all;
V = rand(1024*1024*32,1);
N = 10;
tic; for i=1:N, V1 = V/norm(V);         end; toc % 6.3 s
tic; for i=1:N, V2 = V/sqrt(sum(V.*V)); end; toc % 9.3 s
tic; for i=1:N, V3 = V/sqrt(V'*V);      end; toc % 6.2 s ***
tic; for i=1:N, V4 = V/sqrt(sum(V.^2)); end; toc % 9.2 s
tic; for i=1:N, V1=V/norm(V);           end; toc % 6.4 s

恕我直言,“norm(V)”和“sqrt(V'*V)”之间的差异足够小,对于大多数程序来说,最好选择更清晰的那个。对我来说,“norm(V)”更清晰、更容易阅读,但“sqrt(V'*V)”在 Matlab 中仍然是惯用的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 MATLAB 中有效地标准化向量?有相关的内置函数吗? [关闭] 的相关文章

随机推荐