我有一个矢量:
vector = [1 2 3;4 5 6; 7 9 0]
vector =
1 2 3
4 5 6
7 9 0
我想采取这个并创建一个单位向量。我们可以做到这一点:
mag = sqrt(sum(vector'.^2))'
mag =
3.7417
8.7750
11.4018
当我们尝试将每个元素除以幅度时,我得到一个错误:
vector./mag
Error using ./
Matrix dimensions must agree.
基本上我必须将每行中的每个向量元素除以mag向量中的每一行。我怎么能这样做?
答案 0 :(得分:9)
其他答案会给出正确的结果,但您可以对计算进行矢量化以便更快地进行计算。
ret = bsxfun(@rdivide, vector, mag)
我建议使用bsxfun
,这是一个非常有用的矩阵计算函数。
答案 1 :(得分:3)
问题在于,正如错误消息所示,vector
和mag
的尺寸不匹配。
您希望将vector
第一行的每个元素除以mag(1)
。
你需要的是repmat()
,其中"重复数组的副本"。
写
repmat(mag,1,3)
返回3x3
矩阵,以便每列都是mag
的精确副本:
3.7417 3.7417 3.7417
8.7750 8.7750 8.7750
11.4018 11.4018 11.4018
所以你可以使用单行:
vector./repmat(mag,1,3)
ans =
0.26726 0.53452 0.80178
0.45584 0.56980 0.68376
0.61394 0.78935 0.00000
这样,vector
的第一行,即[1 2 3]
,按[3.7417 3.7417 3.7417]
逐个元素划分。
换句话说,vector
的每个元素除以正确的幅度。
答案 2 :(得分:2)
一个简单的解决方案是使用for循环:
mCategoriesListview.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount != 0) {
// add next 10 items in array list and notify adapter change
}
});
答案 3 :(得分:2)
您可以在MATLAB中使用矩阵运算符:
result = diag(1./mag)*vector;
如果mag
的维度太大,您可以使用它的稀疏版本:
result = spdiags(1./mag,0,speye(numel(mag)))*vector;
答案 4 :(得分:1)
vector = [1 2 3; 4 5 6 ;7 9 0] ;
[n,m]=size(vector);
for i=1:n
normv=norm(vector(i,:),2);
nvector(i,:)=vector(i,:)/normv;
end
nvector 将包含每行的标准化向量