从MATLAB中的大小,最后一个值和第一个值开始

时间:2015-09-19 19:17:48

标签: matlab image-processing matrix vectorization

我是MATLAB的新手,我对以下问题有以下公式。如果我想将灰度从64设置为256,我只需修改矩阵以创建M[256,3],其中:

  1. M[Xi,1]=M[Xi,2]=M[xi,3]
  2. M[Xi,Yi] < M[Xi+1,Yi]
  3. M[1,Yi]=0
  4. M[256,Yi]=1.
  5. 所以我需要创建一个我不知道的步骤矩阵;最后一个元素是1,第一个元素是0,我得到了以下适用于任何列的公式:

    C[i]= X0 - (Xn*i -Xn)/N
    

    其中X0=0Xn=1N=256

    这样的循环:

    k=(1:256);
    for i=1:256,
       k(i)=(i-1)/255;
    

    然后将值设置为颜色调色板

    palette=zeros(256,3);
    
     for ii=1:3, 
         palette(:,ii)=k;
     end
    

    还有其他选择吗?对于我认为MATLAB必须具备的东西,使用那么多循环真的很烦人:根据第一个元素,最后一个元素和向量的大小将值设置为数组。

3 个答案:

答案 0 :(得分:3)

我们bsxfun -

palette = bsxfun(@rdivide,[0:255]',255*ones(1,3))

说明:以下是从原始循环方法开始推断出bsxfun解决方案的方法:

1)设置1D i值数组 -

I=(1:256)-1 

2)将255的除数存储为3的行向量,这些元素对应于三列所需输出 -

D = 255*ones(1,3)

3)最后,在转置I之后,按D执行I的元素划分,以便为我们提供所需的输出 -

out = bsxfun(@rdivide,I.',D)

答案 1 :(得分:2)

首先需要从X0Xn的等距步长向量,总共N个点。正是这可以通过

来实现
linspace(X0,Xn,N)

(请注意,这是一个行向量,即其size[1 N])。重复这3次的最简单方法是repmat函数,它以第二个参数指定的方式重复其第一个参数,所以

repmat(linspace(X0,Xn,N)',[1 3])

将按列方式重复linspace(X0,Xn,N)'(行向量,大小为[N 1])三次,完全创建所需的矩阵(大小为[N 3])。

请注意,@Divakarhis answer的评论中指出,转置的正确方法是linspace(X0,Xn,N).',因为.'是转置运算符。简单地使用'将计算共轭转置,但只要您使用实数这两个是相同的(但它很容易忘记{{} 1}}如果你真的只想转置一个复杂的变量。)

答案 2 :(得分:2)

gray函数执行此操作:

palette = gray(256);