在matlab中,从n个数字里面不重复地选出1个到n个组合,一共2的n次方-1种,怎么把这些情况都列出来?
a=[2,3,5,8,3,2,5,8,6,4,7,6,8];
len=length(a);
%将重复的数字设为非数
for n=1:len
for m=n+1:len
if a(m)==a(n)
a(m)=nan;
end,
end,
end;
%去掉a中的非数
a(find(isnan(a)))=[];
b=a;
是用枚举的方法来求所有可能的排列组合吗?那样的话n行k列就有k的n次方种可能。
写个脚本随机生成一个矩阵,然后再求和就好了:
clc
clear
n = 4;
k = 2;
c = randint(n,k,10) % 随机生成一个n行k列的不大于10的整数矩阵
d = zeros(n,k^n);
for i = 1:n
d(i,:) = reshape(repmat(c(i,:),[k^(n-i),k^(i-1)]),1,k^n); % 把元素按行排整齐:-)
end
disp('d = '),disp(d); % 待求和的矩阵d
d_sum = sum(d) % 求和后的结果
subcombine 函数代码
function subcombs = subcombine(array)
subcombs = {array(1)};
if length(array) > 1
for elem = subcombine(array(2:end))
subcombs = [subcombs{:}, elem, [elem{:}, array(1)]];
end
end
运行结果
subcombine 函数接受一个向量作为输入参数,返回一个子元素都是向量的元胞结构,每个子元素向量都代表一种组合;
函数第 6 行解析:赋值号右边数组中,第一个元素对当前的 subcombs 变量解构,表示取所有已知组合,第二个元素表示加入当前遍历到的子函数结果,第三个元素表示加入附加了向量首个元素的子函数遍历结果;
算法本质是递归子数组,每次调用 subcombine 函数的过程为:
[1] 取输入向量的首个元素单独作为一种组合;
[2] 递归调用 subcombine 函数,参数为 排除首个元素的向量;
[3] 遍历返回值,每个结果作为一种组合,结果与当前向量的首个元素同样作为一种组合;
[4] 当前函数在上述三个步骤得到的所有组合作为结果返回上层函数;
递归函数边界条件:当输入向量只有一个元素时,直接返回这个元素;
递归函数初始条件:输入参数是包含所有元素的向量;
等效的 Python 代码如下:
更新:
Matlab 可以通过 cellfun 替代 for 循环,以得到更简洁的代码,并实现对输入向量类型为 cell array 元胞数组的支持:
更新的 combine 函数代码
更新的函数加入了对空数组的判断,并对输入为空数组的情况返回空元胞数组,由于解析顺序不同,返回结果中的组合的排列顺序也和最初版本不一致:
运行结果
如何用matlab从信号中把噪声分离出来
Matlab并非万能,但如果你有了把噪声分离的思路,它可以帮你实现。在模拟信号中,最常用的方法是滤波,比如有用信号是正弦波,噪声是白噪声,通过滤波以后,信噪比可以提高。如果是数字信号,通过削波、限幅等办法可以解决一部分问题,而通过抗干扰编码则有明显效果。
matlab中如何定义变量从负无穷到正无穷
inf(无穷大)是Matlab预定义变量,负无穷大用-inf表示,正无穷大用+inf表示。定义变量从负无穷到正无穷,可以这样来应用,如 >> syms x >> int(exp(-x^2),-inf,+inf) %exp(-x^2)的定积分,x变量从负无穷到正无穷 ans = pi^(1\/2)...
matlab怎样从一个数组中提取正数并运算再放回原位
那这里只有对B进行循环。最后要把C放回原位,用A(index_positive)= C;就可以了。对于一个1000×1000的数组(矩阵),这个方法的速度提高是很可观的。原因在于它使用C语言实现了循环,而for循环是用matlab语言实现的,判断循环条件的时候大大消耗了时间。希望对你有所帮助。
matlab如何从三个数中等概率挑选一个
直接函数不知有没有,可以用randint函数达到效果。例如:三个数为:36, 99, 23 随机取出的数赋于变量R 代码:>> A=[36 99 23];>> R=A(randint(1,1,[1,3])) %randint(n,m, [a ,b]) 生成n*m维随机整数矩阵,元素值介于a,b之间 R = 99 ...
matlab如何从一向量a中提取数据组成一个新的向量,使得新的向量包含a...
a=[2,3,5,8,3,2,5,8,6,4,7,6,8];len=length(a);将重复的数字设为非数 for n=1:len for m=n+1:len if a(m)==a(n)a(m)=nan;end,end,end;去掉a中的非数 a(find(isnan(a)))=[];b=a;
Matlab怎样从多组数据中分别选取1个数进行组合
要是从一个矩阵里面取可以m=[...]; n=m(2,:)获取固定行,任意列 d=ceil(rand(size(m,1),1)*size(m,2)); for i=1:length(d) n(i)=m(i,d(i));end 得到各行的随机列 如果是多组向量,可先变成矩阵做处理
matlab算法从一个数组中选出5个数并全部显示
先使用nchoosek(x,m)函数,将5个数的可能情况列举出来,再利用perms([a ... b])将取出的5个数进行排列组合。例如:a=[1 3 2];nchoosek(a,2)ans = 1 3 1 2 3 2 perms([1 3])ans = 3 1 1 3
请问matlab如何从excel表格中读取数据,谢谢
第二种方法,就是把字符转化为数字,使用函数str2num xlsread的使用 EXAMPLES:1. Default operation:NUMERIC = xlsread(FILE);[NUMERIC,TXT]=xlsread(FILE);[NUMERIC,TXT,RAW]=xlsread(FILE);2. Get data from the default region:NUMERIC = xlsread('c:\\matlab\\work\\myspreadsheet')3. Get data...
matlab中把图形从一个图形窗口移到另一个窗口
图形窗口上方有个箭头的标识,你点一下,然后再把鼠标放到图中就可以选中曲线了,到另一个图形窗口中,同样点一下那个箭头,然后ctrl+v就可以了
怎样用matlab从txt文件中读取数据,每次只读取一行?
linspace(-150,150,500),linspace(-150,150,500));z = griddata(temdat(:,1),temdat(:,2),temdat(:,4),x,y);meshc(x,y,z);axis([0,180,0,180]);坐标放在D:\\test.txt里(你也可以改成其他的),格式如下:45 32 56 78 45 21 46 79 55 46 75 22 14 69 75 ...
冀文盐酸: 比如这N个数为[4 2 6 8 10 3]要从中选m=4个数 a=[4 2 6 8 10 3];m=4; b=a(randperm(length(a))); b=b(1:m)
会昌县19189113289: 请问用Matlab可以从字母数字组成的字符串中提取数字吗? - ?
冀文盐酸: MATLAB中字符串处理函数指令 中有个isletter,判断是否是字母 有个例子:str='Matlab R12.1';is_isletter=isletter(str) 结果是is_isletter =1 1 1 1 1 1 0 1 0 0 0 0 可见isletter的返回值是个矩阵,是字母的位置返回“1”,不是则返回“0” 因此你要的功能可以据此函数写出, 查找到为1的元素转为空矩阵后,将剩余的数字字符串转化为数值
会昌县19189113289: matlab 哪个函数可以从一组数据中随机抽取一部分出来 - ?
冀文盐酸: 假设你原来的数据存在变量a中如果,你想从a中随机抽取固定N个数 c=randperm(numel(a)); b=a(c(1:N)); b就是从a中随机抽取的N个数(N应该小于a中元素的总个数)
会昌县19189113289: MATLAB+如何从数组A中找出不等于数组B中的数的位置?假设数组A为1到2n组成,数组B为1到n组成 - ?
冀文盐酸: n=5; A=1:n B=1:2*n [Lia,Locb] = ismember(A,B) 结果: A =1 2 3 4 5 B =1 2 3 4 5 6 7 8 9 10 Lia =1 1 1 1 1 Locb =1 2 3 4 5 另一个: n=5; A=[5 11 5 13 4] B=1:2*n [Lia,Locb] = ismember(A,B) 结果: A =5 11 5 13 4 B =1 2 3 4 5 6 7 8 9 10 Lia =1 0 1 0 1 Locb =5 0 5 0 4 说明:Lia中1表示A中元素与B中相同的位置,0表示不同的位置 Locb中0表示不同元素在B中位置
会昌县19189113289: matlab多个长度为3的数组,个数不确定,怎么从每一个数组中取一个数字,得到全排列 - ?
冀文盐酸: 这个不叫全排列吧,应该叫全组合. 编了个函数给你:function C = allcombs(varargin) n = nargin; if n s = '[x1'; for i=2:n s = [s sprintf(',x%i',i)]; end s = [s ']=ndgrid(varargin{:});']; eval(s); s = '[x1(:)'; for i=2:n s = [s sprintf(',x%i(:)',i)]; end s = [s ']']; C = eval(...
会昌县19189113289: matlab中如何产生N个随机数,和为定值M - ?
冀文盐酸: 实现方法:首先使用rand()函数生成N个随机数,假设此时N个随机数的和是S,那么将每个随机数变为原来的M/S倍,这样就实现N个随机数的和是定值M的效果了.关键代码如下: A = rand(1,N); S = sum(A); B = A*M/S; 下面进行实例演示和...
会昌县19189113289: MATLAB求助:字符串读取 - ?
冀文盐酸: 如果这个很长的字符串包含空格,那么读入是应该加空格辨认,不要因为空格把字符串拆散了. 假设你的这个文本文件是 myfile.txt 具体操作如下:cell_string=textread('myfile.txt','%s','whitespace',''); 如果没有空格,可以去掉空格辨认如下 ...
会昌县19189113289: matlab里面怎么表示M个数里面取N个的概率? - ?
冀文盐酸: C=nchoosek(n,k)函数 从n个元素中一次选其中k个元素的所有组合C(注意C是一个数值).这将有助于你计算概率
会昌县19189113289: MATLAB如何把n个数不重复地随机分为m组 - ?
冀文盐酸: 用crossvalind函数.具体用法看帮助文档.Indices =crossvalind('Kfold', length(a), 10);
会昌县19189113289: matlab a(:,:,1)是什么意思 - ?
冀文盐酸: a这是是一个三维矩阵,a(:,:,1)表示取a矩阵第一页的所有行和列. 三维矩阵中第一维为行,第二维为列,第三维为页; matlab中矩阵用:表示取该维度的所有下标值.