Matlab 版 (精华区)

发信人: hahn (有奇~~Not Over But another Start...), 信区: Matlab
标  题: [合集] 请教各位高手:如何在Matlab中动态建立一个映射?
发信站: 哈工大紫丁香 (Wed Jan 24 00:50:34 2007), 站内

────────────────────────────────────────
  wandawj (Puking)                 于  (Mon Jul 31 19:51:10 2006)  说道:

想实现如下的映射,例如:
f:101->1
  122->2
  199->3
  ...
这些映射是动态映射?


────────────────────────────────────────
  peak (peak)                      于  (Mon Jul 31 20:11:58 2006)  说道:

用数组或结构都可以啊
f.x=101;
f.y=1
f(2).x=122;
f(2).y=2;
.
.
.

【 在 wandawj (Puking) 的大作中提到: 】
: 想实现如下的映射,例如:
: f:101->1
:   122->2
: ...................



────────────────────────────────────────
  wandawj (Puking)                 于  (Mon Jul 31 20:32:25 2006)  说道:

谢谢,但这个好象不行吧,关键是在建立映射之后还要使用该映射
【 在 peak (peak) 的大作中提到: 】
: 用数组或结构都可以啊
: f.x=101;
: f.y=1
: f(2).x=122;
: f(2).y=2;
: .
: .
: .





────────────────────────────────────────
  wandawj (Puking)                 于  (Mon Jul 31 20:36:07 2006)  说道:

如建立映射之后,例如再遇到x=122是我希望得到2,本来使用类似函数表的方法可以轻松实
现,但是在x取值范围很大时会占用太多内存,希望有动态建立这种映射方法.
【 在 wandawj (Puking) 的大作中提到: 】
: 谢谢,但这个好象不行吧,关键是在建立映射之后还要使用该映射





────────────────────────────────────────
  peak (peak)                      于  (Mon Jul 31 20:46:04 2006)  说道:

f.x=101;
f.y=1
f(2).x=122;
f(2).y=2;

随时可以使用或修改 f(n).x 和 f(n).y
当然也可以得到这种影射的关系。
例如 f(2).x=122; 你自然可以得到对应的 f(2).y=2

x取值范围的大小由matlab自动维护,我想double类型足够了吧?
另外,使用这种结构时需要预先分配大小,否则速度会很慢。
例如 
预先估计n=1000,那么最好对f初始化(matlab自动动态分配存储空间):
f(1000).x=0;
f(1000).y=0;
这样速度会快好些

【 在 wandawj (Puking) 的大作中提到: 】
: 如建立映射之后,例如再遇到x=122是我希望得到2,本来使用类似函数表的方法可以轻松实
: 现,但是在x取值范围很大时会占用太多内存,希望有动态建立这种映射方法.




────────────────────────────────────────
  peak (peak)                      于  (Mon Jul 31 20:50:54 2006)  说道:

我觉得由 x=122 自动得到 y=2 有问题吧?
影射不是别名,要想由x的具体值得到对应的y的具体值,你需要有一个检索的过程吧?
即使是函数表还得有一个查表的过程呢。

【 在 wandawj (Puking) 的大作中提到: 】
: 如建立映射之后,例如再遇到x=122是我希望得到2,本来使用类似函数表的方法可以轻松实
: 现,但是在x取值范围很大时会占用太多内存,希望有动态建立这种映射方法.




────────────────────────────────────────
  wandawj (Puking)                 于  (Mon Jul 31 21:04:26 2006)  说道:

在我的问题中x取整数型数据,我不需要索引,因为用索引的话就需要比较判断,我不希望使
用比较操作,所以想使用映射的方法.
【 在 peak (peak) 的大作中提到: 】
: f.x=101;
: f.y=1
: f(2).x=122;
: f(2).y=2;
: 随时可以使用或修改 f(n).x 和 f(n).y
: 当然也可以得到这种影射的关系。
: 例如 f(2).x=122; 你自然可以得到对应的 f(2).y=2
: x取值范围的大小由matlab自动维护,我想double类型足够了吧?
: ...................





────────────────────────────────────────
  peak (peak)                      于  (Mon Jul 31 21:10:42 2006)  说道:

sorry,超出了我的能力范围
这个"影射"的概念超出了我所能理解的范围。

如果是一个固定的函数关系,我想这是函数里的影射,只需要知道一个关系和一个变量就可以了;如果仅仅是无函数关系的表格形式的"影射",没有比较判断就能自动得出两个变量之间的关系,这个好像俺就不会了。

呵呵

【 在 wandawj (Puking) 的大作中提到: 】
: 在我的问题中x取整数型数据,我不需要索引,因为用索引的话就需要比较判断,我不希望使
: 用比较操作,所以想使用映射的方法.




────────────────────────────────────────
  wandawj (Puking)                 于  (Mon Jul 31 22:14:59 2006)  说道:

你这几个语句也有问题啊,假设前面有
f.x=101;
f.y=1
f(2).x=122;
f(2).y=2;
现在我有x=122,你怎么能给我输出y=2呢?

【 在 peak (peak) 的大作中提到: 】
: f.x=101;
: f.y=1
: f(2).x=122;
: f(2).y=2;
: 随时可以使用或修改 f(n).x 和 f(n).y
: 当然也可以得到这种影射的关系。
: 例如 f(2).x=122; 你自然可以得到对应的 f(2).y=2
: x取值范围的大小由matlab自动维护,我想double类型足够了吧?
: ...................





────────────────────────────────────────
  wandawj (Puking)                 于  (Mon Jul 31 22:21:40 2006)  说道:

用数组是可以实现的,假设x最大取值为100,我们可以生成一个行或列向量Vector,然后输入
值x作为向量的坐标或下标使得Vector(x)=y就可以实现该映射,上述方法的缺点是在x的取
值范围很大时需要生成很大的Vector向量,占用很大内存,所以我想是不是能有建立一种好
的动态映射的方法来解决这个缺点.
【 在 peak (peak) 的大作中提到: 】
: sorry,超出了我的能力范围
: 这个"影射"的概念超出了我所能理解的范围。
: 如果是一个固定的函数关系,我想这是函数里的影射,只需要知道一个关系和一个变..
: 呵呵





────────────────────────────────────────
  hahn (有奇@选择遗忘的自由)       于  (Tue Aug  1 01:12:11 2006)  说道:

我理解你的意思,
试试这个函数的效率:

function i=dmap(x)
f=[101 122 199];
i=find(f==x);

【 在 wandawj (Puking) 的大作中提到: 】
: 想实现如下的映射,例如:
: f:101->1
:   122->2
: ...................



────────────────────────────────────────
  wandawj (Puking)                 于  (Tue Aug  1 20:38:37 2006)  说道:

谢谢,这个方法我想到过,但find函数还是执行比较操作,我的意思是主要是想减少比较操作
的次数.
【 在 hahn (有奇@选择遗忘的自由) 的大作中提到: 】
: 我理解你的意思,
: 试试这个函数的效率:
: function i=dmap(x)
: f=[101 122 199];
: i=find(f==x);





────────────────────────────────────────
  hahn (有奇@选择遗忘的自由)       于  (Tue Aug  1 23:27:15 2006)  说道:

如果这样子,对时间要求很严.
那可能需要自己写一个效率高一些的查找程序了.

【 在 wandawj (Puking) 的大作中提到: 】
: 谢谢,这个方法我想到过,但find函数还是执行比较操作,我的意思是主要是想减少比较操作
: 的次数.




────────────────────────────────────────
  nc (nc)                          于  (Wed Aug  2 16:57:51 2006)  说道:

既然不能从实际问题找出映射关系,我只知道两种办法:要么作拟合,要么查表
不知有没其他方法?



查表的话,要降低空间复杂度,可以通过适当增加时间复杂度来换取,比如:
建表时:先对X排序,分段建立多个子表,再为各子表的最小值建个索引表
查表时:先查子表索引表,再在子表内查找


至于如何提高查表效率,如果是同时对多个Xi查表,本版3910的方法或许有所帮助
没直接用find,但用到sort排序,还是有比较的过程
不过,相对Xi逐一查表快太多了



【 在 wandawj (Puking) 的大作中提到: 】
: 用数组是可以实现的,假设x最大取值为100,我们可以生成一个行或列向量Vector,然后输入
: 值x作为向量的坐标或下标使得Vector(x)=y就可以实现该映射,上述方法的缺点是在x的取
: 值范围很大时需要生成很大的Vector向量,占用很大内存,所以我想是不是能有建立一种好
: ...................



────────────────────────────────────────
  hahn (有奇@选择遗忘的自由)       于  (Thu Aug  3 08:07:49 2006)  说道:

恩,拟合是不行了,可以用快速递归的查表的方法,
因为你这个是有序的,省去sort环节,效率可以提高的.

【 在 nc (nc) 的大作中提到: 】
: 既然不能从实际问题找出映射关系,我只知道两种办法:要么作拟合,要么查表
: 不知有没其他方法?
: 查表的话,要降低空间复杂度,可以通过适当增加时间复杂度来换取,比如:
: ...................



[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:3.652毫秒