【问题标题】:matlab: mapping function over columns (like lisp)matlab:列上的映射函数(如lisp)
【发布时间】:2015-03-09 07:04:19
【问题描述】:

我需要在矩阵的列上应用一个函数。假设我有这个矩阵--

>> m = rand(3,3)
m =
    0.8626    0.5661    0.8489
    0.6830    0.1498    0.1401
    0.0857    0.4775    0.3296

还有上下界的两个向量--

>> mins = [2 3 5]
mins =
     2     3     5

>> maxs = [7 11 13]
maxs =
     7     11     13

现在我要做的是将矩阵拆分为列--

>> cols = num2cell(m, 1)
cols = 
    [3x1 double]    [3x1 double]    [3x1 double]

现在我正在尝试对每列应用一个函数,该函数采用下限和上限来规范化列值,更具体地说 我想用 mins(1) 和 @ 规范化列 m(:,1) 987654326@、m(:,2)mins(2)maxs(2) ... 列 m(:,n)mins(n)maxs(n) 等等。 我的看法是这样的——

>> norm_cols = cellfun(@(c, lb, ub) (ub - lb) .* c + lb, cols, mins, maxs);
Error using cellfun
Input #3 expected to be a cell array, was double instead.

我的问题是这样的事情在 matlab 中可行吗?并且可以说这是可行的,那么如何将拆分的列再次合并到矩阵中?

此外,请注意我知道循环,但我不想使用它(因为我的矩阵可以像 1000x1000 一样增长),所以请不要提供任何使用循环的解决方案。虽然我不确定函数映射是否可以比循环提供更好的加速(这是另一个问题,但不是今天)。

【问题讨论】:

  • @Nitish 好吧,“规范化”是我认为不好的词选择,我想在列中的每个值上应用 min + (max - min) * x
  • 嗯。那个糟糕的词选择让我在错误的方向上工作了一段时间!

标签: matlab matrix lambda


【解决方案1】:

嗯,你当然可以这样做

>> x = {[1; 2; 3]/10, [4; 5; 6]/10, [7; 8; 9]/10};
>> mins = {1.5 4.5 7.5};  
>> maxs = {2.5 5.5 8.5};
>> y = cellfun(@(a, lb, ub) (ub-lb) * x + lb, x, mins, maxs, 'uniform', 0)

y = 

    [3x1 double]    [3x1 double]    [3x1 double]

>> [y{:}]

ans =

   1.600000000000000   4.900000000000000   8.199999999999999
   1.700000000000000   5.000000000000000   8.300000000000001
   1.800000000000000   5.100000000000000   8.400000000000000

但是使用bsxfun 跨行广播你的参数甚至更酷,而无需先将其转换为元胞数组

>> x = [1 4 7; 2 5 8; 3 6 9] / 10;
>> mins = [1.5 4.5 7.5];
>> maxs = [2.5 5.5 8.5];
>> y = bsxfun(@plus, bsxfun(@times, x, maxs-mins), mins);

【讨论】:

  • 谢谢,但我是matlab的新手,所以如果你能详细说明一下,那就太好了。 i) 你为什么用 10 来划分元素? ii) 为什么用{} 而不是[] 定义数组,{} 是什么意思? iii) cellfun() 中的 uniform0 是什么? iv)bsxfun() 就是我要找的东西!
  • 1.除以 10 因为在您的示例中,所有输入都在 0 和 1 之间; 2.语法{}创建一个cell array而不是一个矩阵(与num2cell的输出相同); 3. 提供'uniform'0 告诉cellfun 你希望你的输出是一个单元数组(非均匀)而不是矩阵(这是均匀的)
猜你喜欢
  • 2014-04-26
  • 2010-11-02
  • 2011-06-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-17
  • 1970-01-01
相关资源
最近更新 更多