常见MATLAB小技巧

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{:})


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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值