hihocoder #1363 : 图像算子(高斯消元)

原创 2016年08月29日 00:36:25

描述

在图像处理的技术中,经常会用到算子与图像进行卷积运算,从而达到平滑图像或是查找边界的效果。

假设原图为H × W的矩阵A,算子矩阵为D × D的矩阵Op,则处理后的矩阵B大小为(H-D+1) × (W-D+1)。其中:

B[i][j] = ∑(A[i-1+dx][j-1+dy]*Op[dx][dy]) | (dx = 1 .. D, dy = 1 .. D), 1 ≤ i ≤ H-D+1, 1 ≤ j ≤ W-D+1

给定矩阵A和B,以及算子矩阵的边长D。你能求出算子矩阵中每个元素的值吗?

输入

第1行:3个整数,H, W, D,分别表示原图的高度和宽度,以及算子矩阵的大小。5≤H,W≤60,1≤D≤5,D一定是奇数。

第2..H+1行:每行W个整数,第i+1行第j列表示A[i][j],0≤A[i][j]≤255

接下来H-D+1行:每行W-D+1个整数,表示B[i][j],B[i][j]在int范围内,可能为负数。


输入保证有唯一解,并且解矩阵的每个元素都是整数。

输出

第1..D行:每行D个整数,第i行第j列表示Op[i][j]。

样例输入
5 5 3
1 6 13 10 3
13 1 5 6 15
8 2 15 0 12
19 19 17 18 18
9 18 19 5 17
22 15 6
35 -36 51
-20 3 -32
样例输出
0 1 0
1 -4 1
0 
 

Op[1][1]、Op[2][1]、……Op[D][1]、Op[2][1]、Op[2][2]、……Op[D][D] 这D*D个未知变量

i*j个等式 求位置变量的值

高斯消元

但是很奇怪的是。。。数组为什么要开的那么大才能过 根据这个题目的数据范围 我觉的没有必要搞这么大的啊。。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>

#define MEM(a,x) memset(a,x,sizeof a)
#define eps 1e-9
#define MOD 10009
#define MAXN 10010
#define MAXM 100010
#define INF 99999999
#define ll __int64
#define bug cout<<"here"<<endl
#define fread freopen("ceshi.txt","r",stdin)
#define fwrite freopen("out.txt","w",stdout)

using namespace std;

int A[110][110],B[110][110];
double a[5000][5000],x[5000];
int equ,var;

int Gauss()
{
    int i,j,k,col,max_r;
    for(k=0,col=0;k<equ&&col<var;k++,col++)
    {
        max_r=k;
        for(i=k+1;i<equ;i++)
            if(fabs(a[i][col])>fabs(a[max_r][col]))
                max_r=i;
        if(fabs(a[max_r][col])<eps) return 0;
        if(k!=max_r)
        {
            for(j=col;j<var;j++)
            {
                swap(a[k][j],a[max_r][j]);
            }
            swap(x[k],x[max_r]);
        }
        x[k]/=a[k][col];
        for(j=col+1;j<var;j++)
            a[k][j]/=a[k][col];
        a[k][col]=1;
        for(i=0;i<equ;i++)
            if(i!=k)
        {
            x[i]-=x[k]*a[i][col];
            for(j=col+1;j<var;j++)
                a[i][j]-=a[k][j]*a[i][col];
            a[i][col]=0;
        }
    }
    return 1;
}


int main()
{
//    fread;
    int h,w,d;
    while(scanf("%d%d%d",&h,&w,&d)!=EOF)
    {
        for(int i=0;i<h;i++)
            for(int j=0;j<w;j++)
                scanf("%d",&A[i][j]);
        for(int i=0;i<h-d+1;i++)
            for(int j=0;j<w-d+1;j++)
                scanf("%d",&B[i][j]);
        int num=0;
        for(int i=0;i<h-d+1;i++)
            for(int j=0;j<w-d+1;j++)
        {
            for(int k=0;k<d;k++)
                for(int l=0;l<d;l++)
            {
                a[num][k*d+l]=A[i+k][j+l];
            }
            x[num]=B[i][j];
            num++;
        }
        equ=num;//等式个数
        var=d*d;//变量个数
        Gauss();
        for(int i=0;i<d*d;i++)
        {
            if(i%d!=0) printf(" ");
            if(x[i]>-1e-6) printf("%.0f",x[i]+1e-6);
            else printf("%.0f",x[i]-1e-6);
            if(i%d==d-1) puts("");
        }
    }
    return 0;
}







      

poj 1222 高斯消元详解

题意 有一个5 * 6的矩阵,每个位置表示灯,1表示灯亮,0表示灯灭。 然后如果选定位置i,j点击,则位置i,j和其上下左右的灯的状态都会反转。 现在要你求出一个5 * 6的矩阵,1表示这个灯被...
  • u013508213
  • u013508213
  • 2015年08月03日 22:34
  • 2209

高斯消元原理

高斯消元法的步骤: 设方程组中方程的个数为equ,变元的个数为var,注意:一般情况下是n个方程,n个变元,但是有些题目就故意让方程数与变元数不同) 1. 把方程组转换成增广矩阵。 2. 利用初等行...
  • ACdreamers
  • ACdreamers
  • 2013年05月30日 17:10
  • 3775

整数高斯消元模板

#include #include #include using namespace std; #define MAXN 400 int a[MAXN+10][MAXN+10],x[MAXN+10],...
  • outer_form
  • outer_form
  • 2016年01月28日 11:28
  • 445

同余意义下的高斯消元解决几类常见的问题+例题

高斯消元法 以下高斯消元指的是列主元高斯消元法。 高斯消元法除了解浮点数线性方程,它还可以用于求矩阵的秩,求某些线性空间中的一组线性无关的基,解同余方程组。 求秩 SGU 200 Crac...
  • abc13068938939
  • abc13068938939
  • 2016年12月13日 19:10
  • 618

高斯消元算法 详解

对于正在学习或已经学完线性代数的同学来说,高斯消元并不算是一个新的知识点(假如你在课堂上认真听讲并且没有挂科的话)         首先来看一下什么是高斯消元,其实说白了,就是线性代数里通过矩阵求线...
  • wr132
  • wr132
  • 2014年11月27日 19:52
  • 819

高斯消元快速入门

高斯消元快速入门 一、基本描述 学习一个算法/技能,首先要知道它是干什么的,那么高斯消元是干啥的呢? 高斯消元主要用来求解线性方程组,也可以求解矩阵的秩,矩阵的逆。在ACM中是一个有力的...
  • pengwill97
  • pengwill97
  • 2017年08月15日 21:32
  • 537

高斯消元模板

mod 2 方程写法: int Gauss(int n, int m){ int r = 0, c = 0; while(r < n && c < m){ int id...
  • My_ACM_Dream
  • My_ACM_Dream
  • 2015年05月05日 21:32
  • 1379

高斯消元法 (模板)

/* 用于求整数解得方程组. */ #include #include #include using namespace std; const int maxn = 105; //矩阵大小 i...
  • FeBr2
  • FeBr2
  • 2016年08月15日 14:35
  • 520

高斯消元原理

高消一直是ACM中高层次经常用到的算法,虽然线性代数已经学过,但高消求解的问题模型及高消模板的应用变化是高消的最复杂之处。 先介绍一下高消的基本原理:引入互联网czyuan的帖子: 高斯消元法,是...
  • xuanandting
  • xuanandting
  • 2016年08月15日 16:30
  • 1170

浮点数高斯约当消元法模板

void read(){ Read(n),Read(m); int i,j; for(i=1;i
  • outer_form
  • outer_form
  • 2016年01月27日 23:13
  • 649
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:hihocoder #1363 : 图像算子(高斯消元)
举报原因:
原因补充:

(最多只允许输入30个字)