您的位置:首页 > 编程语言 > MATLAB

常见MATLAB小技巧

2015-11-24 20:35 711 查看
Cookbook 供自己查阅

问题1:一个m*n阶的矩阵A,一个m维列向量B,如何对A的每行操作,减去列向量对应的值,如:A=[1 2 3; 3 4 5],B=[1,2].得到结果是C=[0 1 2;1 2 3].

方案:

A = [1 2 3; 3 4 5];

B = [1,2];

C = bsxfun(@minus, A, B.')

问题2:一个m*n阶的矩阵A,返回该矩阵每行最小的列的标号

方案:[c,p]=max(A,[],2);%p为m*1的列向量,每个值为列号

 

问题3:matlab中var(x,w)后面加个w是什么意思

var用来计算方差,w表示权重,也就是说,x中各元素的重要程度不同。

其计算过程如下:

w = w(:)/sum(w) % 权重归一化
avg = sum(w.*x) % 计算加权平均值
cx = x - avg % 各元素对均值的偏差量
y = sum((conj(cx).*cx).*w) % 对偏差加权求方差


以x=[1;2;3];w=[0.1 0.2 0.3];为例:

w = w(:)/sum(w) % w=[0.167 0.333 0.50];
avg = sum(w.*x) % avg=sum(0.167 0.667 1.50)=2.333
cx = x - avg % cx=[-1.333 0.333 0.667]
y = sum((conj(cx).*cx).*w) % 对偏差加权求方差(-1.333)*(-1.333)+0.333*0.333+0.667*0.667=0.556


问题4:一个函数的某个参数为空或者不存在如何表示

function [centroids, idx] = runkMeans(X, initial_centroids, max_iters, plot_progress)
% Set default value for plot progress
if ~exist('plot_progress', 'var') || isempty(plot_progress)
plot_progress = false;
end


问题5:如有一个mX2的矩阵A,每行保存的是矩阵B部分元素的坐标,想将矩阵B中对应的A中元素置为1,除了循环给每个元素置1,请问还有什么好方法?

示例(为了与其它元素区别,赋值用NaN):

% 生成测试数据
B = magic(5);
B = B(1:3, :)
[r,c] = find(B>20);
A = [r c]

% 将B中以A作为下标的元素置为NaN
B((A(:,2)-1)*size(B,1)+A(:,1)) = NaN


输出:

>> B = magic(5);
>> B = B(1:3, :)
B =
17    24     1     8    15
23     5     7    14    16
4     6    13    20    22
>> [r,c] = find(B>20);
>> A = [r c]
A =
2     1
1     2
3     5
>> B((A(:,2)-1)*size(B,1)+A(:,1)) = NaN
B =
17   NaN     1     8    15
NaN     5     7    14    16
4     6    13    20   NaN


附:提取矩阵元素的三种方法:

diag(B(A(:,1),A(:,2)))
arrayfun(@(r,c)B(r,c),A(:,1),A(:,2))
B((A(:,2)-1)*size(B,1)+A(:,1))

6.定位图像中像素坐标的方法(matlab)

显示图像后,直接在命令窗口输入impixelinfo敲回车(可以实时显示鼠标所在位置的坐标和像素值)


7.寻找两个向量的不同
>>> a=[5:9];
>>> b=[1:6];
>>> [value,indxe]=setdiff(a,b)
val =

7     8     9

ind =

3
4
5

8.matlab的struct结构体数组如何进行大量赋值 
比如a=struct('ID', {1,2,3,4,5,6,7,8,9,10})
如果我要把a(1:2:9).ID赋值为1:5,除了用for循环外,应该如何写?

b = mat2cell(1:5,1,ones(1,5))
[a(1:2:9).ID] = deal(b{:})

来自http://www.ilovematlab.cn/thread-302309-1-1.html    

9.结构数组的相关内容
9.1 结构数组的初始化

factors = repmat(struct('var', [], 'val', []), n , 1);


9.2 提取结构数组中某一域的值
stockName = {'股票1','股票2','股票3','股票4','股票5'};
stockPrice = 1:5;
stocks = struct('Name', stockName, 'Price', num2cell(stockPrice));

stocks=
'股票1'	1
'股票2'	2
'股票3'	3
'股票4'	4
'股票5'	5
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: