您建议的原始代码是最好的方法。
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 中仍然是惯用的。