matlab中的map语句

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了matlab中的map语句相关的知识,希望对你有一定的参考价值。

1,
[p,map]=imread('peppers.bmp');
h=imshow(p,map)
2,
p=imread('peppers.bmp');
h=imshow(p)
这两个语句有什么区别呢?map是什么含义?谢谢啦。

map里储存的是颜色索引,就是一张各个数字对应颜色的表格。
如果bmp文件是真彩色或灰度的,不需要色表,得到的p是二维或三维的矩阵,数值介于0到255之间。
如果是索引格式的(如256色、16色等等)就有这样一张表格,p是一个二维矩阵,数值介于0-255或0-15之间,显示图像时需要色表才能正确对应颜色。

MATLAB是美国MathWorks公司出品的商业数学软件,用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境,主要包括MATLAB和Simulink两大部分。
MATLAB是matrix&laboratory两个词的组合,意为矩阵工厂(矩阵实验室)。是由美国mathworks公司发布的主要面对科学计算、可视化以及交互式程序设计的高科技计算环境。它将数值分析、矩阵计算、科学数据可视化以及非线性动态系统的建模和仿真等诸多强大功能集成在一个易于使用的视窗环境中,为科学研究、工程设计以及必须进行有效数值计算的众多科学领域提供了一种全面的解决方案,并在很大程度上摆脱了传统非交互式程序设计语言(如C、Fortran)的编辑模式,代表了当今国际科学计算软件的先进水平。
参考技术A map里储存的是颜色索引,就是一张各个数字对应颜色的表格。
如果bmp文件是真彩色或灰度的,不需要色表,得到的p是二维或三维的矩阵,数值介于0到255之间。如果是索引格式的(如256色、16色等等)就有这样一张表格,p是一个二维矩阵,数值介于0-255或0-15之间,显示图像时需要色表才能正确对应颜色。本回答被提问者和网友采纳

MATLAB中的映射函数?

【中文标题】MATLAB中的映射函数?【英文标题】:Map function in MATLAB? 【发布时间】:2010-11-02 06:15:39 【问题描述】:

我有点惊讶 MATLAB 没有 Map 函数,所以我自己拼凑了一个,因为我离不开它。那里有更好的版本吗?是否有一个我缺少的用于 MATLAB 的标准函数式编程库?

function results = map(f,list)
% why doesn't MATLAB have a Map function?
results = zeros(1,length(list));
for k = 1:length(list)
    results(1,k) = f(list(k));
end

end

用法例如

map( @(x)x^2,1:10)

【问题讨论】:

从其他语言到 Matlab 的第 1 课:不要使用 for 循环,它们比矢量化解决方案慢几个数量级。 随着 JIT 的引入,for 循环不再像以前那样受到惩罚。 @CookieOfFortune 我认为这不再是真的...... @AnderBiguri 我认为他们已经添加了一些改进,但仍然慢得多。 File Exchange 上的Functional Library 有mapfoldl(也称为reduce)、select(又名filter)和其他不可或缺的好东西。推荐(如果您必须使用 Matlab)。 【参考方案1】:

简短的回答:内置函数 arrayfun 与您的 map 函数对数值数组所做的完全一样:

>> y = arrayfun(@(x) x^2, 1:10)
y =

     1     4     9    16    25    36    49    64    81   100

还有另外两个类似的内置函数:cellfun(作用于元胞数组的元素)和structfun(作用于结构的每个字段)。

但是,如果您利用矢量化,特别是使用元素方面的arithmetic operators,这些函数通常是不必要的。对于您给出的示例,矢量化解决方案将是:

>> x = 1:10;
>> y = x.^2
y =

     1     4     9    16    25    36    49    64    81   100

有些操作会自动跨元素进行操作(例如将标量值添加到向量),而其他操作符对元素操作有特殊的语法(在操作符前用. 表示)。 MATLAB 中的许多内置函数旨在使用逐元素操作对向量和矩阵参数进行操作(通常应用于给定维度,例如 summean),因此不需要映射函数.

总而言之,这里有一些对数组中每个元素求平方的不同方法:

x = 1:10;       % Sample array
f = @(x) x.^2;  % Anonymous function that squares each element of its input

% Option #1:
y = x.^2;  % Use the element-wise power operator

% Option #2:
y = f(x);  % Pass a vector to f

% Option #3:
y = arrayfun(f, x);  % Pass each element to f separately

当然,对于这样一个简单的操作,选项#1 是最明智(也是最有效)的选择。

【讨论】:

需要注意的是,选项1不仅更简单,而且速度更快(与选项3相比,2应该与1非常相似)!【参考方案2】:

如前面的答案中所述对解决方案进行矢量化可能是提高速度的最佳解决方案。 Vectorizing也很Matlaby,感觉不错。

话虽如此,Matlab 现在确实有一个 Map 容器类。

见http://www.mathworks.com/help/matlab/map-containers.html

【讨论】:

Op 是在讨论高阶函数,即cellfun 等,而不是哈希表或键值对。【参考方案3】:

如果需要的结果是函数数组,则内置的arrayfun 似乎不起作用: 例如: 地图(@(x)[x x^2 x^3],1:10)

下面的一些小改动使这项工作更好:

function results = map(f,list)
% why doesn't MATLAB have a Map function?
for k = 1:length(list)
    if (k==1)
        r1=f(list(k));
        results = zeros(length(r1),length(list));
        results(:,k)=r1;
    else
        results(:,k) = f(list(k));

    end;
end;
end

【讨论】:

ARRAYFUN 将适用于您的示例,您只需包含输入参数 ..., 'UniformOutput', false); 即可创建包含您的数组的单元格数组输出,然后将它们格式化并组合成您想要的非-单元格数组。【参考方案4】:

一个相当简单的解决方案,使用 Matlab 的矢量化将是:

a = [ 10 20 30 40 50 ]; % the array with the original values
b = [ 10 8 6 4 2 ]; % the mapping array
c = zeros( 1, 10 ); % your target array

现在,输入

c( b ) = a

返回

c = 0    50     0    40     0    30     0    20     0    10

c( b ) 是对大小为 5 的向量的引用,其中 c 的元素位于 b 给定的索引处。现在,如果你为这个引用向量赋值,c 中的原始值将被覆盖,因为 c( b ) 包含对 c 中值的引用并且没有副本。

【讨论】:

【参考方案5】:

除了向量和元素操作之外,还有cellfun 用于在元胞数组上映射函数。例如:

cellfun(@upper, 'a', 'b', 'c', 'UniformOutput',false)
ans = 
    'A'    'B'    'C'

如果 'UniformOutput' 为真(或未提供),它将尝试根据元胞数组的维度连接结果,所以

cellfun(@upper, 'a', 'b', 'c')
ans =
ABC

【讨论】:

【参考方案6】:

您不需要map,因为应用于值列表的标量函数应用于每个值,因此其工作方式类似于map。试试看

l = 1:10
f = @(x) x + 1

f(l)

在你的特殊情况下,你甚至可以写

l.^2

【讨论】:

-1:这实际上不是真的。 Matlab 没有足够强大的类型系统来指定标量函数。 f 与向量一起调用,并在您的示例中执行单个向量加法。要验证这一点,请分析您的代码示例(在运行代码之前“配置文件”,然后在它之后“配置文件关闭报告”)。你会看到有一个对 f 的调用。【参考方案7】:

如果matlab没有内置map函数,可能是出于效率考虑。在您的实现中,您使用循环来迭代列表的元素,这在 matlab 世界中通常是不受欢迎的。大多数内置 matlab 函数都是“矢量化的”,即。 e.在整个数组上调用函数比自己迭代它并为每个元素调用函数更有效。

换句话说,这个


a = 1:10;
a.^2

比这快得多


a = 1:10;
map(@(x)x^2, a)

假设您对地图的定义。

【讨论】:

我认为他的观点不是他希望它必须循环,而只是被指定为具有将提供的函数应用于提供的数组的相应元素的结果数组。我不太了解matlab,但似乎arrayfun 可以完成这项工作。 大多数内置的 Matlab 函数和运算符已经这样做了:它们对输入数组的每个元素进行操作,并返回相应的结果数组。

以上是关于matlab中的map语句的主要内容,如果未能解决你的问题,请参考以下文章

MATLAB中的映射函数?

Matlab 中的类和 switch 语句

循环问题,因为matlab中'if'语句中的'continue'语句[关闭]

matlab colourmap怎么用

利用Matlab中的imread怎么读取图片

matlab中的profile如何用