Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
';*作为matlab中点函数的快速替换_Matlab_Optimization - Fatal编程技术网

';*作为matlab中点函数的快速替换

';*作为matlab中点函数的快速替换,matlab,optimization,Matlab,Optimization,我分析了一些matlab代码,发现我的执行时间主要是调用dot。在探查器中显示的函数列表中,我注意到以下注释行: 当A和B都是列向量时,点(A,B)与A'*B相同 最初,我的代码运行时间约为22秒,其中对dot的140976次调用花费了17.5秒。我将代码改为使用'*而不是点,总运行时间下降到14秒!这个操作符显然比函数调用获取短列向量的点积要快得多 我的问题是:“”*操作符到底是什么,它是否有文档记录(源代码中没有),它可以/应该用于什么 请注意:我使用的是Matlab vintage R20

我分析了一些matlab代码,发现我的执行时间主要是调用
dot
。在探查器中显示的函数列表中,我注意到以下注释行:

当A和B都是列向量时,点(A,B)与A'*B相同

最初,我的代码运行时间约为22秒,其中对
dot
的140976次调用花费了17.5秒。我将代码改为使用
'*
而不是
总运行时间下降到14秒!这个操作符显然比函数调用获取短列向量的点积要快得多

我的问题是:“
”*
操作符到底是什么,它是否有文档记录(源代码中没有),它可以/应该用于什么


请注意:我使用的是Matlab vintage R2010b。

没有
'*
操作符,它是两个按顺序调用的操作符。首先是转置,然后是矩阵乘法


如果
A
B
都是列向量,那么通过将
A
转换为行向量,两者的矩阵积等于点积,即两个的每个对应元素的所有积之和没有
'*
运算符,这是两个按顺序调用的运算符。首先是转置,然后是矩阵乘法


如果
A
B
都是列向量,那么通过将
A
转换为行向量,两者的矩阵积等于点积,即两个的每个对应元素的所有积之和,您确定得到的结果相同吗?因为点函数在相同维度的两个向量之间执行点积,而“*执行矩阵积。前

A=[1 1 1];
B=[2 2 2];
A'*B =  2     2     2
        2     2     2
       2     2     2

dot(A,B)= 6
我认为你考虑的是A*B',在向量是行向量的情况下,它等于点积

如果向量是列向量,请使用“*”。
要求和,如果要执行点积,则需要行*列形式的向量。(使用dot函数时不必考虑这一点)

你确定你得到了同样的结果吗?因为点函数在相同维度的两个向量之间执行点积,而“*执行矩阵积。前

A=[1 1 1];
B=[2 2 2];
A'*B =  2     2     2
        2     2     2
       2     2     2

dot(A,B)= 6
我认为你考虑的是A*B',在向量是行向量的情况下,它等于点积

如果向量是列向量,请使用“*”。

要求和,如果要执行点积,则需要行*列形式的向量。(使用dot函数时不必考虑这一点)

你也可以试试
sum(bsxfun(@times,A,B))
。你是在处理复数吗?我猜那就不行了。@Divakar,没有复数,只有两列向量。事实上,我取的是两个向量之间的平方差,所以完整表达式是
(f-b)*(f-b)
,其中
f
b
是两个长度为
5
的实列向量。我不太懂MATLAB,所以如果有更好的方法,我也不会感到惊讶!因为您正在寻找平方和,所以快速优化的方法是:
sum((f-b)。^2)
@Divakar我的问题是变量名选择不当(
sum
)。作为记录,在所有的建议中,
(f-b)*(f-b)
在这种情况下是最快的。你也可以尝试一下
sum(bsxfun(@times,A,b))
。你是在处理复数吗?我猜那就不行了。@Divakar,没有复数,只有两列向量。事实上,我取的是两个向量之间的平方差,所以完整表达式是
(f-b)*(f-b)
,其中
f
b
是两个长度为
5
的实列向量。我不太懂MATLAB,所以如果有更好的方法,我也不会感到惊讶!因为您正在寻找平方和,所以快速优化的方法是:
sum((f-b)。^2)
@Divakar我的问题是变量名选择不当(
sum
)。为了记录在案,在所有建议中,
(f-b)*(f-b)
在这种情况下是最快的。此外,如果你做了许多点积,很可能你可以“矢量化”它们,这意味着你可以通过矩阵乘法或通过
bsxfun
在一次运算中计算出许多点积。这取决于数据的组织方式和程序的结构。如果
A
B
是矩阵,那么
diag(A'*B)
dot(A,B)
相同感谢您的澄清,我不知道
'
意味着
转置(MATLAB肯定不是我的强项)@彼得也感谢你的投入。这个操作仍然是代码中的瓶颈,所以也许我可以从矢量化中获益。@TomFenech只是一个警告:
不是转置<代码>“
是转置<代码>“是共轭的transpose@Dan,点的实现使用
sum(conj(a).*b)
,这相当于但比
diag(a'*b)
效率更高。此外,如果你做的是许多点积,很可能你可以“矢量化”它们,这意味着你可以在一次操作中计算许多点积,通过矩阵乘法或通过
bsxfun
。这取决于数据的组织方式和程序的结构。如果
A
B
是矩阵,那么
diag(A'*B)
dot(A,B)
相同感谢您的澄清,我不知道
'
意味着
转置(MATLAB肯定不是我的强项)@彼得也感谢你的投入。这个操作仍然是代码中的瓶颈,所以也许我可以从矢量化中获益。@TomFenech只是一个例子