例题9-7 最优矩阵链乘

本文介绍了一种使用动态规划解决矩阵链乘法中如何最小化乘法次数的问题。通过递归地将问题分解并利用已计算的结果来避免重复计算,实现了高效求解。代码采用 C++ 实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<cctype>
using namespace std;
int d[105][105],s[105];
int r()
{
	char ch;
	do
	{
		ch=getchar();
	}while(ch!='-'&&(ch<'0'||ch>'9'));
	int ans=0,f=0;
	if(ch=='-') f=1; else ans=ch-'0';
	while(isdigit(ch=getchar())) ans=ans*10+ch-'0';
	if(f) ans*=-1;
	return ans;
}
int dp(int z,int y)
{
	if(d[z][y]!=0xffffff) return d[z][y];
	for(int k=z;k<=y;k++)
	  if(dp(z,k)+dp(k+1,y)+s[z]*s[k+1]*s[y+1]<d[z][y])
	    d[z][y]=d[z][k]+d[k+1][y]+s[z]*s[k+1]*s[y+1];
    return d[z][y];
}
int main()
{
	int n;
	n=r();
	for(int i=1;i<=n;i++)
	  s[i]=r();
    for(int i=1;i<=n;i++)
      for(int j=1;j<=n;j++)
        d[i][j]=0xffffff;
	for(int i=1;i<=n;i++)          //注意边界 
      d[i][i]=0;
    printf("%d",dp(1,n-1));
	return 0;
}

### Fisher最优鉴别矢量示例 考虑两个类别的样本集 \(C_1\) 和 \(C_2\), 假设这些样本服从高斯分布。为了找到能够最大化类别间分离并最小化类别内部差异的方向,可以应用Fisher线性判别分析。 #### 示例题目描述 给定两类二维数据点: - 类别 \(C_1\) 的平均向量 \(\mu_1=[1, 2]^T\) ,协方差矩阵 \(\Sigma_1=\begin{bmatrix} 0.5 & 0 \\ 0 & 0.5 \end{bmatrix}\) - 类别 \(C_2\) 的平均向量 \(\mu_2=[4, 6]^T\) , 协方差矩阵 \(\Sigma_2=\begin{bmatrix} 0.7 & 0\\ 0& 0.7 \end{bmatrix}\) 目标是求解最佳投影方向 w (即 Fisher 最优鉴别矢量),使得不同类别之间的区分度最大而同一类别内的变化尽可能小。 #### 计算过程 定义 Fisher 判别准则函数 J(w): \[J(w)=\frac{(w^T S_b w)}{(w^TS_w w)}\] 其中, - \(S_b=(\mu_1-\mu_2)(\mu_1-\mu_2)^T\) 表示类间散布矩阵, - \(S_w=\Sigma_1+\Sigma_2\) 是类内散布矩阵。 要使上述比率达到最大值,则需满足: \[|S_w^{-1}S_bw-\lambda I|=0\] 这里 λ 是广义特征值问题中的特征值;I 是单位阵。因此可以通过求解此广义特征值问题获得最优的 w 向量[^1]。 ```matlab % MATLAB code to find the optimal discriminant vector using Fisher&#39;s criterion. Mu1 = [1; 2]; Sigma1 = diag([0.5, 0.5]); Mu2 = [4; 6]; Sigma2 = diag([0.7, 0.7]); Sw = Sigma1 + Sigma2; Sb = (Mu1-Mu2)*(Mu1-Mu2)&#39;; [V,D] = eig(Sw\Sb); % Solve generalized eigenvalue problem [~, idx] = max(diag(D)); % Find index of maximum eigenvalue W_optimal = V(:,idx); disp(&#39;The Optimal Discriminant Vector is:&#39;); disp(W_optimal); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值