声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 1663|回复: 8

[编程技巧] 如何求矩阵中的最小值但不改变矩阵大小

[复制链接]
发表于 2008-1-16 10:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x
问问大虾兄弟们:

这里要求将一个矩阵中的元素全部取绝对值后,求不为0的最小值,要求不改变矩阵的大小,我用的程序
function absmin
c=[];
a=abs(c);
[Y,I]=min( a);
while min( a)==0
    a(:,I)=[];
end
absmin=min( a)

是采用删除含0元素的那整列的方法,这样改变了矩阵的大小,若以后再引用这个矩阵,错误为:Index of element to remove exceeds matrix dimensions.大小不对了.
请问怎样做才能不改变大小而满足要求呢?

另外,弱问,调用这个子程序,我用f=absmin(c),就显示Subscript indices must either be real positive integers or logicals.,应该是matlab要求数组不能从0开始吧,那应该怎么调用呢?C确实也是个矩阵

[ 本帖最后由 eight 于 2008-1-21 20:13 编辑 ]
回复
分享到:

使用道具 举报

发表于 2008-1-16 10:37 | 显示全部楼层

回复 楼主 的帖子

那你就一个一个比较,笨方法

另外把
function absmin
c=[];
改成
function f=absmin(c)试试
 楼主| 发表于 2008-1-16 10:49 | 显示全部楼层

谢谢主任

哦,谢谢主任了,如果那位兄弟眼熟,麻烦按这个要求给个程序吧,小弟用不久,有些命令挺不熟的,时间也算紧.看自己的程序总云里雾里,看别人的程序老是豁然开朗
发表于 2008-1-16 10:59 | 显示全部楼层

回复 3楼 的帖子

突然有个想法,只是不改变矩阵的大小
找到0的项后,不要删,直接附值一个比较大的数
行不?
发表于 2008-1-16 12:56 | 显示全部楼层
a=[-1 2 0; 5 0 0];
a=abs(a);
b=find(a==0);
temp=99999;(取一个数组中没有的数字,比如有特征的数字)
a(b)=temp;
min(a(:))

暂时想到这么多

评分

1

查看全部评分

发表于 2008-1-16 12:57 | 显示全部楼层
我也是这么想的;如有雷同纯属巧合:lol :lol
发表于 2008-1-16 13:13 | 显示全部楼层
a=[-1 2 0; 5 0 0];
b=sort(abs(a(:)),'ascend');
c=b(b>0);min=c(1)

评分

1

查看全部评分

 楼主| 发表于 2008-1-16 22:28 | 显示全部楼层

谢谢大家

谢谢楼上,你们的方法确实很好,花主任的方法我用了,这里具体说下吧,我要做音频文件的水印嵌入和提取:
我是先载入了一个声音文件
[a,fs,bits]=wavread('D:\matlab\work\sound333333.wav');
然后运用小波变换DWT算法进行分解
[c,l]=wavedec(a,3,'haar');    % returns the wavelet decomposition of the signal at
level 3, using 'haar'
再求近似分量的系数
ca3=appcoef(c,l,3,'haar');    % computes the approximation coefficients at level 3 using the wavelet decomposition structure [C,L]

以上都不是关键,这里再要问的是,我得到的这些系数,用matlab显示出来是:
   -0.0269
   -0.0084
    0.0114
    0.0178
    0.0223
    0.0766
    0.0678
    0.0061
    0.0526
    0.0215
   -0.0349
   -0.0146
    0.0319
    0.0776
      .
      .
      .
      .
      .
一长串数字,现在我要求  这些数字取绝对值后,不为0的最小值

子程序我用的花主任的:
function  absmin
a=[-1 2 0; 5 0 0];
b=sort(abs(a(:)),'ascend');
c=b(b>0);absmin=c(1)
经过调试没问题,单独debug结果是:
absmin =

     1

主程序里我调用就是简单的:
q=absmin(ca3);

但最后就会显示这里调用有错误:
??? Error using ==> absmin
Too many input arguments.

Error in ==> watermarking at 14
q=absmin(ca3);

是那些系数不符合子程序的格式要求吗???麻烦大家和2位主任了
发表于 2008-1-17 08:08 | 显示全部楼层
function  absmin
应该为 function  [y]=absmin(x)

你连基本的函数调用还不懂啊

评分

1

查看全部评分

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-12 07:15 , Processed in 0.080166 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表